使用 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 目录中找到它,也可以直接点击菜单栏中的齿轮图标。 运行和调试 菜单
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) 附加
按绿色箭头,选择载具二进制的程序名称(例如:"......")。 自动飞行器
)
请注意,您可以通过点击上图黄色区域在调试终端和 SITL 终端之间进行切换。
在附加之前或之后,您可以在代码中设置断点,开始调试。
使用启动预案调试初始化任务和构造函数¶
备注
调试初始化和构造函数的最简单方法是选择调试点,附加到可执行文件,然后在 MAVProxy 中发出 "重启 "命令。
"这款" 启动
配置文件允许直接调试二进制文件的初始化任务和构造函数等,而无需使用 MAVProxy。启动任务要求要调试的二进制文件已经构建完成。请务必运行 ./waf 旋翼飞行器
否则旧的二进制文件将被调试。
自动测试调试配置文件¶
该配置文件不会自动附加到正确的载具二进制文件,因为自动测试会自动打开并关闭 SITL 的新实例。为了在调试 Python 自动测试代码的同时调试 C++ 代码,请在调用相关 C++ 之前在 Python 代码中创建一个调试点。然后使用 "Attach(连接)"配置文件连接到载具二进制文件。现在 C++ 可执行文件已经附加到 GDB,您可以继续使用 Python 调试器。