记录——ROS下通过GDB调试解决Segmentation fault (core dumped)报错

        在用移动机器人实验的时候,自己写的代码在大部分时候运行都没有问题,但是偶尔会直接报错Segmentation fault (core dumped),即段错误(核心已转储),甚至后续又恢复正常了!于是想着解决这个不知道哪里来的bug。

        Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。解决该问题的最好方法是通过调试找到出错的具体代码。

问题:我的代码是在ROS下的工作空间中,在某些时候运行代码后运行几秒后直接报错Segmentation fault (core dumped),而大部分时候都运行正常。

解决:通过gdb对代码进行调试,确定具体问题所在。前提条件:报错后直接调试

在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调试解决Segmentation fault (core dumped)报错_第1张图片

 

我的工作空间没有编写launch文件,只是通过rosrun启动节点。首先cd到执行文件中,存放的位置路径为:

catkin_workspace/devel/lib/your_package

然后在该路径下的终端输入

gdb your_package

最后会进入gdb模式,然后直接输入

r

开始运行程序,此时会直接帮你定位到具体的代码:

记录——ROS下通过GDB调试解决Segmentation fault (core dumped)报错_第2张图片

 如上图所示,最后调试结果告诉我代码第60行出错。

 

问题分析:关于这一行代码,主要订阅/move_base/status话题,并提取status_list中的一个值,问题是为什么现在跑不起来,而大部分时候都行呢?通过rostopic echo这个话题发现,此时此刻里面并没有值。原来是当机器人启动时还没有进行任何的导航的时候,它里面是没有东西的,只有在进行一次导航后,里面才会一直有值。所以只要在机器人开机后还没有工作前启动该代码即会报错。

修改代码,主要是判断是否为空:

记录——ROS下通过GDB调试解决Segmentation fault (core dumped)报错_第3张图片

 

你可能感兴趣的:(c++,bug,linux)