【ROS】ROS使用GDB调试

本文详细介绍了如何在ROS环境中设置编译模式为Debug,并通过GDB进行程序调试。首先,可以通过在`catkin_make`时添加参数或修改`CMakeLists.txt`来确保程序以Debug模式编译。接着,讲解了两种调试方法:使用`rosrun`启动时添加`launch-prefix`进行调试,以及直接在`devel/lib`目录下用GDB运行程序。最后,列举了一些常用的GDB调试指令。
摘要由CSDN通过智能技术生成

一、引言

  在程序开发过程中难免遇到一些bug,Linux系统中通常使用ROS进行程序调试。这里推荐大佬的博文ROS在线调试(使用GDB)
  ROS官方列出了许多可用的IDE:如VScode, Qtcreator, Ecllipse, Clion等,而这些不方便快速的调试。

二、ROS设置编译模式为Debug

  ROS程序进行catkin_make时默认不是以debug模式进行编译的,这就导致程序在进行gdb调试的时候不能跳转到源代码,只能进入断点。
  普通的非ROS程序用gdb怎么调试呢?可以有两种方法~

  1. 使用catkin_make时添加
catkin_make -DCMAKE_BUILD_TYPE=Debug
  1. 直接修改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")

三、ROS使用GDB调试

  通常ROS节点程序的启动方法有两个:rosrunroslaunch,下面也针对这两种启动方法介绍对应的调试步骤。

3.1 rosrun启动gdb调试

  修改ROS launch文件,在node标签中添加一句话:

launch-prefix="xterm -e gdb -ex run --args "

例如:

<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher" launch-prefix="xterm -e gdb -ex run --args "/>
#添加run在gdb调试时会自动开始执行程序

附: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:
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

在这里插入图片描述
在这里插入图片描述

3.2 rosrun启动GDB调试

  在使用rosrun执行程序时添加以下选项;

rosrun --prefix 'gdb -ex run --args' [package_name] [node_name] 

在这里插入图片描述

3.2 直接在devel/lib使用gdb运行程序

  在执行catkin_make之后会在devel/lib对应的节点文件下生成可执行文件,在source devel/setup.bash之后可以直接在devel/lib执行以下程序,然后继续使用gdb指令进行调试即可

gdb your_node_name

四、GDB指令

  这里暂时先参考爱编程的大丙的优秀文章,这里暂时不介绍过多。

### 使用SSH远程连接并使用GDB调试ROS节点 为了实现通过SSH远程使用GDB调试ROS程序的目标,可以采用`screen -d -m gdb --args`作为启动前缀来运行目标节点。这允许在另一台机器上执行ROS节点的同时,在本地或任何其他位置通过SSH连接到该机器,并重新附着到已分离的屏幕会话中查看和控制GDB进程[^1]。 具体操作如下: #### 设置ROS环境以便于调试 确保ROS工作空间已经配置好并且能够正常编译。如果打算深入分析代码,则应将构建模式设为Debug而非Release,这样可以获得更详细的调试信息[^2]。 #### 启动带有GDB前置命令的ROS节点 利用`rosrun`工具配合特定参数启动需要调试的应用程序实例。对于希望监控其行为的某个ROS节点来说,可以通过指定特殊的launch-prefix选项来嵌入GDB调用。例如, ```bash rosrun --prefix 'screen -d -m gdb --args' package_name executable_file arguments... ``` 这条命令会在后台创建一个新的GNU Screen窗口,并在此环境中启动给定包内的可执行文件及其参数列表;与此同时,它还会自动加载GDB用于后续交互式调试目的。 #### 远程接入正在运行中的GDB会话 一旦上述过程完成之后,即可从任意地点经由SSH隧道访问承载实际计算资源的工作站。登录成功后只需简单输入以下指令就能恢复之前被挂起的任务视图: ```bash screen -D -R ``` 此时即进入了先前建立起来的那个独立Screen终端里边,里面正等待用户进一步指示的是处于暂停状态下的GDB调试器连同关联的目标应用一起。 #### 处理可能出现的问题 当遇到像`process has died`这样的错误提示时,同样也可以借助这种方法来进行故障排查。比如针对名为`feature_tracker`的服务端口意外终止的情况,就可以按照下面的方式尝试获取更多线索: ```bash rosrun --prefix 'gdb -ex run --args' feature_tracker feature_tracker ``` 此方法有助于捕获可能导致崩溃的具体原因所在之处[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值