使用 VSCode 通过 GDB 进行调试

本页介绍如何在 VSCode IDE 中设置和使用 GDB,以调试 SITL、自动测试和单元测试中的问题。

导言

本指南假定您已经按照说明在机器上成功使用了 SITL。 设置 SITL.

安装 GDB

要在 Linux 上安装 GDB,请使用软件包安装程序。如果你使用的是基于 debian 的系统(如 Ubuntu 或 Mint),只需使用 适切 安装 指挥部

苏都 适切 安装 gdb

设置 SITL

为了使用 GDB,您需要在 SITL 联编时配置调试符号。使用 :

./waf 配置 --排错

设置 VSCode 调试器

打开 VSCode,进入 ArduPilot 目录。打开 运行和调试 菜单 (Ctrl+Shift+D)。在 运行和调试 菜单,选择 创建 launch.json 文件.然后选择 添加配置它将打开一个 launch.json 文件,用于设置调试配置。下面是 launch.json 文件的示例。将示例复制粘贴到 VSCode 中新建的 launch.json 文件中,覆盖文件中预设的任何内容,然后保存文件。该示例文件是一个很好的起点,但可以根据自己的喜好进行修改。如果将来需要访问或编辑该文件,可以在 .vscode 目录中找到它,也可以直接点击菜单栏中的齿轮图标。 运行和调试 菜单

./_images/VSCode-config1.png

launch.json 文件示例

// 用于 VSCode 的通用 ArduPilot 调试配置文件
// 参见 https://ardupilot.org/dev/docs/debugging-with-gdb-using-vscode.html
//
// 必须安装 GDB!
// 在基于 Debian 的系统上安装 GDB: `sudo apt install gdb`.
//
// 确保已将 SITL 或 WAF 设置为生成调试符号
// sim_vehicle.py : use '-D', `./Tools/autotest/sim_vehicle.py -v Copter -D --speedup 1 --console --map`.
// waf:使用"--debug"、"./waf configure --board=sitl --debug
//
// 下面的示例针对的是飞机和旋翼飞行器类型的载具。为其他载具创建配置文件
// 将"名称"字段&"程序"字段更改为所需的载具

{
    // 使用 IntelliSense 了解可能的属性。
    // 悬停以查看现有属性的描述。
    // 更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387
    版本";: "0.2.0";,
    "配置";: [

    // 附加配置文件用于连接运行中的 SITL 实例(即可执行文件)
        {
            "名称";: "(gdb) Attach Copter";,
            "类型";: "cppdbg";,
            请求";: attach";,
            "程序";: "${workspaceFolder}/build/sitl/bin/arducopter";,
            "processId";: "${command:pickProcess}";,
            "MIMode";: "gdb";,
            "setupCommands";: [
                {
                    "description";: "为 gdb 启用漂亮打印";,
                    "text";: "-enable-pretty-printing";,
                    忽略失败";: 
                }
            ]
        },
        {
            "名称";: "(gdb)附加平面";,
            "类型";: "cppdbg";,
            请求";: attach";,
            "程序";: "${workspaceFolder}/build/sitl/bin/arduplane";,
            "processId";: "${command:pickProcess}";,
            "MIMode";: "gdb";,
            "setupCommands";: [
                {
                    "description";: "为 gdb 启用漂亮打印";,
                    "text";: "-enable-pretty-printing";,
                    忽略失败";: 
                }
            ]
        },

    //`Launch` 配置文件允许直接调试二进制文件的初始化任务和构造函数等,而无需使用 MAVProxy。
    // 注:调试初始化和构造函数的最简单方法是选择调试点,附加到可执行文件,然后在 MAVProxy 中发出 "reboot" 命令。
    // 启动任务要求要调试的二进制文件已经构建。请务必事先运行 ``./waf copter``,否则将调试旧的二进制文件。
        {
            "名称";: "启动 ArduCopter(调试)";,
            "类型";: "cppdbg";,
            请求";: "launch";,
            "cwd";: "${workspaceFolder}/ArduCopter";,
            "程序";: "${workspaceFolder}/build/sitl/bin/arducopter";,
            "args";: [
                "-S";,                                    // 设置合成时钟模式
                "-w";,                                    // 将模拟 eeprom 擦除为默认值
                "-模型";, 旋翼飞行器;,                     // 设置模拟模型
                "-home";, "36.146,-113.89,1429.75,90",   // 大峡谷高原的地形如下
                "--config";, "-G";,                        // "-G" 选项设置调试符号
                "-加速";, "8";,                        // 设置模拟运行速度比实时速度快多少
                // "--serial4=sim:lightwareserial", // 用于连接模拟串行设备
                "--默认设置";,
                "${workspaceRoot}/ArduCopter/mav.parm";,  // 设置默认设置文件的路径
                "-I0";,
                // "--help" // 列出所有可用命令
            ],
            // "stopAtEntry": false、
            // "environment":[],
            // "externalConsole": false、
            "miDebuggerPath";: "/usr/bin/gdb";,
            "MIMode";: "gdb";,
            "launchCompleteCommand";: "exec-run";,
            "setupCommands";: [
                {
                    "description";: "为 gdb 启用漂亮打印";,
                    "text";: "-enable-pretty-printing";,
                    忽略失败";: 
                }
            ],
            "postRemoteConnectCommands";: [
                {
                    "description";: 在 AP_HAL::panic 处设置断点;,
                    "text";: "-break-insert AP_HAL::panic";,
                    忽略失败";: 错误
                }
            ]
        },
        {
            "名称";: "启动 ArduPlane(调试)";,
            "类型";: "cppdbg";,
            请求";: "launch";,
            "cwd";: "${workspaceFolder}/ArduPlane";,
            "程序";: "${workspaceFolder}/build/sitl/bin/arduplane";,
            "args";: [
                "-S";,
                "-模型";, "飞机";,
                "-加速";, "8";,
                "--默认设置";, "${workspaceRoot}/Tools/autotest/default_params/plane.parm";,
                "-I0";
            ],
            "miDebuggerPath";: "/usr/bin/gdb";,
            "MIMode";: "gdb";,
            "launchCompleteCommand";: "exec-run";,
            "setupCommands";: [
                {
                    "description";: "为 gdb 启用漂亮打印";,
                    "text";: "-enable-pretty-printing";,
                    忽略失败";: 
                }
            ],
            "postRemoteConnectCommands";: [
                {
                    "description";: 在 AP_HAL::panic 处设置断点;,
                    "text";: "-break-insert AP_HAL::panic";,
                    忽略失败";: 错误
                }
            ]
        },

    // 自动测试调试配置文件
    //
    // 注意:此配置文件不会自动附加到正确的载具二进制文件,因为自动测试会自动打开 & 关闭 SITL 的新实例。
    // 为了在调试 Python 自动测试代码的同时调试 C++ 代码,请在调用相关 C++ 代码之前在 Python 代码中创建一个调试点。
    // 然后使用 "Attach" 配置文件附加到载具二进制文件。现在 C++ 可执行文件已经连接到 GDB,您可以继续在 Python 调试器中调试。

        {
            "名称";: "Python:autotest.py";,
            "类型";: python";,
            请求";: "launch";,
            "程序";: "${workspaceFolder}/Tools/autotest/autotest.py";,
            "console";: "integratedTerminal";,
            "justMyCode";: 错误,                         // 该设置允许调试依赖的 Python 模块,如 pymavlink,这些模块会被 autotest 调用和使用
            "args";: [
                "--debug";,
                "--免清洗";,
                "build.Copter";,
                "test.Copter.GuidedSubModeChange";,
                // "--help"、
            ]
        },

    // 单元测试调试简介
    //
    // 通过 Google's gtest 执行单元测试调试
        {
            "名称";: 启动单元测试 SITL TARGET(调试)";,
            "类型";: "cppdbg";,
            请求";: "launch";,
            "cwd";: "${workspaceFolder}/.../testing";,
            "程序";: "${workspaceFolder}/build/sitl/tests/test_sim_ms5611";,
            "miDebuggerPath";: "/usr/bin/gdb";,
            "MIMode";: "gdb";,
            "launchCompleteCommand";: "exec-run";
        },
    ]
}

使用以下命令启动 SITL sim_vehicle.py 请务必添加 -D 来构建和启动带有调试符号的 SITL:

模拟载具.py -v ArduCopter -f 四人 --游戏机 --地图 -D

从运行和调试菜单中选择 (gdb) 附加按绿色箭头,选择载具二进制的程序名称(例如:"......")。 自动飞行器)

./_images/VSCode-config2.png

请注意,您可以通过点击上图黄色区域在调试终端和 SITL 终端之间进行切换。

在附加之前或之后,您可以在代码中设置断点,开始调试。

./_images/VSCode-debug.png

使用启动预案调试初始化任务和构造函数

备注

调试初始化和构造函数的最简单方法是选择调试点,附加到可执行文件,然后在 MAVProxy 中发出 "重启 "命令。

"这款" 启动 配置文件允许直接调试二进制文件的初始化任务和构造函数等,而无需使用 MAVProxy。启动任务要求要调试的二进制文件已经构建完成。请务必运行 ./waf 旋翼飞行器 否则旧的二进制文件将被调试。

自动测试调试配置文件

该配置文件不会自动附加到正确的载具二进制文件,因为自动测试会自动打开并关闭 SITL 的新实例。为了在调试 Python 自动测试代码的同时调试 C++ 代码,请在调用相关 C++ 之前在 Python 代码中创建一个调试点。然后使用 "Attach(连接)"配置文件连接到载具二进制文件。现在 C++ 可执行文件已经附加到 GDB,您可以继续使用 Python 调试器。