作者:Sam (甄峰) sam_code@hotmail.com
在使用C++开发ROS程序时,经常需要逐行调试代码。 这时就需要用到GDB了。
之前在Linux上使用GDB, 在嵌入式系统或Android使用过GDB Server。
知道GDB使用中需要注意哪些问题。
1. 编译时,需要加入-g 选项。
2. 不能有任何strip的动作。不能被去掉debug信息。
1.
处理CMakeLists.txt文件:
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}
-g ")
set (CMAKE_VERBOSE_MAKEFILE ON)
第一句保证了CXXFLAGS被加上了-g
第二局保证了具体的Make语句被显示出来,我们可以实际检查编译选项是否正常。
2. 运行语句:
2.1: 运行ros master
$roscore
2.2: 运行想要Debug的程序:
进入catkin_ws/devel/lib/Package_Name. 可以看到可执行文件。
$gdb ./example2_sam
3. DEBUG :
(gdb) l
可以看到代码。
(gdb) b 20
在20行加入Bread点。
(gdb) r
开始运行。 只有此时,Node才会被建立起来。
3. launch文件启用GDB:
4. CORE文件相关:
5. 调试信息:
在调试程序时,可以通过信息记录显示程序的运行状态。但需要这样的信息记录的行为不会影响软件的运行效率,不会和正常的输出混淆。
ROS中,就有满足以上要求,内置于log4cxx之上的API。
与Kernel中printk类似,ROS的调试信息也包含不同的信息级别:
5.1:调试信息宏:
ROS_DEBUG()
ROS_INFO()
ROS_WARN()
ROS_ERROR()
ROS_FATAL()
ROS_DEBUG()和ROS_INFO()通常显示在stdout上。其它的则显示在stderr上。且颜色也不同。
5.2: 信息级别:
默认情况下,系统会显示INFO和更高级别的调试信息。
想要调节这个级别,可以在编译时设定,也可以在在执行前使用配制文件调整,也可以在运行中,使用工具动态调节。
方法一:
在代码中调节:
在ROS::init()后,加入代码
方法二:
在CMakeLists.txt 中,添加宏记录去除器。
方法三: