文章目录
- 一、问题描述
- 二、配置步骤
- 1. debug 模式编译
- 2. rosrun 添加GDB指令
- 3. launch 添加GDB指令
- 三、GDB基本命令
- 1. 基本
- 2. 显示被调试文件信息
- 3. 查看/修改内存
- 4. 断点
- 5. 调试运行
一、问题描述
在享受ROS带来便利的同时,但因每运行出现错误,ROS不会报错,导致很难排查原因,ROS wiki 官方列出了许多可用的IDE,如 VScode,Clion 等,而这些不方便快速的调试,故整理了ROS添加GDB工具。
二、配置步骤
1. debug 模式编译
编译器有些优化会让debug无法进行。为避免这种情况,程序编译时要加上debug选项,让cmake以debug模式编译,不然可能会在gdb调试的时候不能跳转到源代码,只能进入断点。
普通的非ROS程序添加gdb调试,要在CMakeLists.txt 前面添加:
set(CMAKE_BUILD_TYPE Debug)
在输入catkin_make编译时加上一个参数:
catkin_make -DCMAKE_BUILD_TYPE=Debug
或修改CMakeLists.txt,添加如下:
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
2. rosrun 添加GDB指令
终端 rosrun 添加gdb指令如下:
rosrun --prefix 'gdb -ex run --args' [package_name] [node_name]
效果如下:
rosrun 其实类似于直接执行二进制文件 ./文件,所以我们也可以直接运行catkin_make产生的二进制文件。每一个package产生的二进制文件存放的位置在如下路径:
you_catkin_workspace/devel/lib/your_package_name
cd 进去上面的地址,在 CMakeLists.txt
里通过add_executable
产生的那个二进制文件的名字(就是rosNode了).在终端中输入:
gdb node_name
3. launch 添加GDB指令
修改ROS launch文件,在node标签中如下指令launch-prefix="xterm -e gdb -ex run --args
:
<launch><arg name="config_file" default="$(env HOME)/project/slam_learn/vins/fusions_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml" /><node pkg="vins" name="vins_node" type="vins_node" output="screen" launch-prefix="xterm -e gdb -ex run --args" args="$(arg config_file)" />
</launch>
附:roslaunch node前缀
The launch-prefix attribute of the tag that, among other things, makes it easy to debug a ROS node process. Here are some example launch-prefixes you might find useful:
command implication launch-prefix=“xterm -e gdb --args” run your node in a gdb in a separate xterm window, manually type run to start it launch-prefix=“gdb -ex run --args” run your node in gdb in the same xterm as your launch without having to type run to start it launch-prefix=“stterm -g 200x60 -e gdb -ex run --args” run your node in gdb in a new stterm window without having to type run to start it launch-prefix=“valgrind” run your node in valgrind
(这个valgrind工具可以用于检测内存泄露,并执行性能分析)launch-prefix=“xterm -e” run your node in a separate xterm window launch-prefix=“nice” nice your process to lower its CPU usage launch-prefix=“screen -d -m gdb --args” useful if the node is being run on another machine; you can then ssh to that machine and do screen -D -R to see the gdb session launch-prefix=“xterm -e python -m pdb” run your python node a separate xterm window in pdb for debugging; manually type run to start it
在执行对应的 launch ,就会先打开一个下图右侧新的Shell界面:
如果使用的是Python来写ROS,则需要修改调试器为pdb,如下:
launch-prefix="xterm -e python -m pdb "
注意:未安装 xterm
工具时运行launch 时会报如下错误,sudo apt-get install xterm
安装xterm即可。
三、GDB基本命令
1. 基本
命令 | 描述 |
---|---|
gdb | 打开调试器 |
file FILE | 装载指定可执行文件 |
r | 代表run,从头开始运行程序直到断点。在一次debug中你可以通过用 r 来多次重新运行程序,而不必重新rosrun 或 roslaunch. |
q | 退出debug |
bt | 列出调用堆栈 |
2. 显示被调试文件信息
命令 | 描述 |
---|---|
info files | 显示被调试文件的详细信息 |
info func | 显示所有函数名称 |
info local | 显示当前函数中的局部变量信息 |
info prog | 显示被调试程序的执行状态 |
info var | 显示所有的全局和静态变量名称 |
3. 查看/修改内存
命令 | 描述 |
---|---|
p x | 相当于“print x”。显示当前变量 x 的值。 |
display x | 和print的区别是,x不是只显示一次就消失,而是一直显示,每次继续运行程序都会刷新。相当于VS的“watch”功能。 |
undisplay x | 停止对变量x的display |
x address | 查看指针所指位置的值。 |
set x = 12 set x = y | 修改变量x的值。 |
call function() | 调用某函数。这个函数可以是你程序里定义的函数,甚至是标准库函数,我的理解是只要在当前位置可访问到的函数都可以调用。这是一个极其有用的功能,生生把c++用成Matlab 。 |
4. 断点
命令 | 描述 |
---|---|
b | b即break。在当前行设置断点。 |
b | 45 在某行设置断点。 |
b functionName | 在某函数开始处设置断点。常用:b main 在程序开始设置断点。 |
watch x == 3 | 设置条件断点。这个比VS的条件断点更方便,因为它不需要设置在哪一行!时刻监控! |
info break | 查看当前存在的所有断点。每个断点都有自己的编号。 |
delete N | 删除编号为N的那个断点。 |
5. 调试运行
命令 | 描述 |
---|---|
n | “next”。运行一行代码。 相当于VS的step over。 |
s | “step”。运行一个指令。相当于VS的step in。n和s都可以一次运行多行,比如n 5 |
c | “continue”。继续运行直到下一个断点。 |
f | “finish”,运行完当前程序。相当于VS的 step out。 |