该文档将会持续进行更新,涉及ROS调试中遇到的一些问题。
C++程序的调试也相仿,只是去掉了启动
roscore
的部分
通常步骤
1. 程序编译
这部分并不打算采用vscode的tasks.json来配置编译命令,而是选择手动的运行:
catkin_make --only_pkg-with-deps package_name
该命令可以单独的编译某个特定的package及其依赖项。
需要主要的是CMakeLists.txt应当修改成Debug模式:
OPTION(DEBUG_ON "Turn on DEBUG Mode" ON)
IF(DEBUG_ON)
MESSAGE("[Debug Mode]")
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
ELSE()
MESSAGE("[Release Mode]")
SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
ENDIF()
这样OPTION改成ON或者OFF,即可指定编译模式,比较方便。
2. 配置launch.json
这部分工作是本文的重点,单击vscode最右侧工具栏的Debug按钮(图标是一个甲虫+暂停),点击debug页里的齿轮按钮,即可打开launch.json。内容修改成如下状态:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "LiTAMIN2",
"type": "cppdbg",
"request": "launch",
"program": "/home/xyw/catkin_ws/devel/lib/test_registration/test_registration_node",
"args": ["251370668.pcd","251371071.pcd"],
"stopAtEntry": true,
"cwd": "${workspaceFolder}/data",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
解释下比较重要的几个选项:
program:
输入可执行文件的所在位置,要求是绝对路径。如果是ROS的话,一般编译出来都在~/catkin_ws/devel/lib/包名/节点名
。
args:
传入到程序里的参数,即main接受的argv,不需要则设置为[]
stopAtEntry:
设置为true,则会在刚进入程序后直接暂停,比较方便的一共功能,建议使能。
cwd:
指定程序运行的环境,需要注意的是${workspaceFolder}
指的是.vscode
文件夹的上层路径,以我的环境为例,等价于/home/xyw/catkin_ws/src/test_registration
。
(详情见于vscode变量含义)
3. 运行调试
在进入调试前,首先需要打开一个终端,运行roscore
,否则节点无法正常启用。
启动后,按工具栏左侧的Debug按钮,点击出现的浮窗里的绿色箭头,即可开始调试。
出错解决
1. 无法载入断点
报错信息:Module containing this breakpoint has not yet loaded or the breakpoint address could not be obtained.
这一般是因为编译时没有加-g
导致的。有时候即便OPTION改成了ON,但编译依然还会按照OFF进行,这一点可以从编译输出信息里得到确认。
解决方法:catkin_make --only_pkg-with-deps package_name
加上后缀DDEBUG_ON=ON
,再重新编译。