ros 中使用 gdb 在线调试

环境

安装 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博客

如何在Ubuntu上安装和配置GNOME桌面?-CSDN博客

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值