ubuntu下gdb调试ROS
参考:
使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客
https://blog.csdn.net/weixin_45031801/article/details/134399664?spm=1001.2014.3001.5506
一、调试准备
1.1 CMakeLists改动
注释文件中的
set(CMAKE_BUILD_TYPE "Release") #构建类型:发行版本
在这句位置处加入
SET(CMAKE_BUILD_TYPE "Debug")#构件类型:调试版本
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")#关闭优化便于调试、增加生成调试信息
正常编译工作空间
catkin_make
二、在vscode下调试
2.1 设置c_cpp_properties.json
其中${workspaceFolder}指启动vscode所在文件夹,确定包含所有文件的路径即可
{
"configurations": [
{
"name": "ROS",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/**",
"/opt/ros/noetic/include/**",
"${workspaceFolder}/devel/include",
"/opt/ros/noetic/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-x64",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}
2.2 设置launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "ROS GDB", // 配置名称,将会在调试配置下拉列表中显示
"type": "cppdbg", // 调试器类型 该值自动生成
"request": "launch", // 调试方式,还可以选择attach
"program": "${workspaceFolder}/devel/lib/……", //要调试的程序(完整路径,支持相对路径)即可执行文件路径
"args": [], // 传递给上面程序的参数,没有参数留空即可
"stopAtEntry": false, // 是否停在程序入口点(停在main函数开始)
"cwd": "${workspaceRoot}", // 调试程序时的工作目录
"environment": [], //针对调试的程序,要添加到环境中的环境变量. 例如: [ { "name": "squid", "value": "clam" } ]
"externalConsole": false, //如果设置为true,则为应用程序启动外部控制台。 如果为false,则不会启动控制台,并使用VS Code的内置调试控制台。
"MIMode": "gdb", // VSCode要使用的调试工具
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
2.3 设置tasks.json
{
"tasks": [
{
"type": "cppbuild",//任务类型,可以取cppbuild、shell、process,三种执行时稍有差异,这里选择默认cppbuild。
"label": "build",//任务标签(标记),也即任务名称,任务名称要和launch.json里的"preLaunchTask"值对应一致。
"command": "/usr/bin/g++",//编译器及其路径,.c用gcc编译器,cpp用g++编译器
"args": [
"-fdiagnostics-color=always",
"-g",//生成和调试有关的信息,launch.json会用到这些信息。
"${workspaceFolder}/src/……/*.cpp",//编译当前打开的.c(或.cpp)文件。
"-o",//指定编译的输出
"${workspaceFolder}/build"
],
"options": {
"cwd": "${workspaceFolder}"//当前工作目录(路径)。
},
"problemMatcher": ["$gcc"],//使用gcc的问题匹配器。
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
2.4 启动vscode调试
vscode左侧边栏选择运行和调试,选择launch.json中配置好的配置名称即可开始debug
三、在gdb终端下调试
1.1 终端gdb优缺点
缺点:
不如vsode可视化方便,全部需要命令操作
优点:
能够附加到已运行的程序上调试,而不需要作额外配置,vscode做不到读取rosparam调试,需要手动给值,而这个不需要手动给,尤其在launch多节点调试时
1.2 调试方法
首先正常启动节点或launch,使其运行,然后找到进程id号列表
ps aux | grep 可执行文件名
若是多节点运行,则会存在多个命名空间及其唯一的id,复制想要调试的id到${id}处,一定要给sudo权限
sudo gdb -p ${id}
出现以下界面证明成功,点击回车即可进入gdb
1.3 gdb基本命令
退出gdb调试
两者都可
q
quit
设置断点,关键字b/break + 程序名 + : + 行号,如
两者都可
b main.cpp:5
break main.cpp:5
查看所有断点
info breakpoints
删除指定断点,如2
d 2
删除所有断点
d breakpoints
使2号断点有效/无效
enable/disable b 2
继续执行c,停止执行ctrl+c
从一个断点运行到下一个断点处
c
若执行到断点处,自动停止继续执行
此时可查看变量,print xxx可显示一次,display xxx可在每次打断后都自动跟踪显示,假设变量flag
print flag
display flag
取消跟踪flag
undisplay flag
手动设定某变量值 ,如flag
set flag = 1
线程查看
显示当前线程
thread
显示所有线程,其中带*为当前线程
info threads
切换到第3线程
thread 3
查看栈
bt