环境
安装 gdb,桌面环境使用 gnome (ubuntu默认桌面组件)
查看是否安装 gdb:
gdb -v
安装 gdb:
sudo apt install gdb
查看是否安装 gnome:
ps -A | egrep -i "gnome|mate|cinnamon|lx|xfce|jwm"
安装 gnome:
sudo apt install ubuntu-gnome-desktop
debug 模式编译
catkin_make 编译:
catkin_make -DCMAKE_BUILD_TYPE=Debug
或者在 CMakelist.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")
launch 文件中添加 gdb 调试指令
在 launch 文件中的 node 标签添加以下代码,launch 会用 gdb 来启动节点
launch-prefix="gnome-terminal -x gdb --args"
e.g.
<node pkg="abc" type="abc" name="abc" output="screen" launch-prefix="gnome-terminal -x gdb --args">
<param name="a" value="10"/>
</node>
参数 “gnome-terminal -x” 是让该节点另开终端交互
如果是使用 “XTerm” 终端,指令要改为:
launch-prefix="xterm -e gdb --args"
参数 "gdb" 是 gdb 手动启动节点,若想在 gdb 中自动启动节点,指令要改为:
launch-prefix="gnome-terminal -x gdb -ex run --args"
手动启动节点的话,方便添加断点调试
e.g.
" launch-prefix="gnome-terminal -x gdb -ex run --args" "指令的启动效果
GDB 基本命令
命令 | 描述 |
r | 从头开始运行程序直到断点 |
c | 继续运行程序直到断点 |
n N | 运行 N 代码,省略 N 只运行一行代码 |
f | 运行完程序 |
q | 退出 gdb |
bt | 列出调用堆栈 |
b filename:line_number | 在 filename 文件的第 line_number 行加断点 |
b function_name | 在 function_name 函数开始处加断点 |
info break | 查看所有断点信息 |
d N | 删除编号 N 的断点 |
p v | 打印变量 v |
v address | 打印变量 v 的地址 |
set v=x | 给变量 v 赋值 x |
call func() | 在当前位置调用函数 func |
e.g.
在 navit_controller_node 节点中添加 gdb 调试:
<node name="navit_controller_node" pkg="navit_controller" type="navit_controller_node" output="screen" launch-prefix="gnome-terminal -x gdb --args">
<rosparam file="$(find scarab_local_planner)/config/local_planner_sim.yaml" command="load" />
<rosparam file="$(find scarab_local_planner)/config/local_costmap_sim.yaml" command="load" />
</node>
启动后,在 controller_server_node.cpp 文件的 26 行加断点,在 gdb 调试终端输入
b controller_server_node.cpp:26
如图:
在 controller_server.cpp 文件的 36 行加断点,会提示是否要在库加载后加断点(在 navit_controller 包的 CMakeList.txt 中 controller_server.cpp 是编译为另外的库文件),选择 y,然后查看所有断点
如图:
输入 r 运行程序到第一个断点,然后再输入 c 继续运行到第二个断点
如图:
由于 controller_server.cpp 文件的 36 行是空行,所以程序运行到了 37 行停止
在控制器插件的 path_follow_local_planner 包中的 path_follow_control.cpp 的 207 行加断点
b path_follow_control.cpp:207
运行后如图:
查看 cmd_vel 值,然后修改 cmd_vel 值
输入 bt 查看堆栈
#0 是当前函数地址,#1 是调用 #0 函数的函数地址 ...
参考:
ROS在线调试(使用GDB)_ros gdb_敢敢のwings的博客-CSDN博客
[ROS] 编辑launch文件时,使用launch-prefix = “xterm-e“出错_xterm -e_Nnboylhj的博客-CSDN博客