首先安装gdb和xterm
sudo apt install xterm
Ubuntu系统一般默认自带gdb,通过 gdb -v 看看有没有输出,有版本输出则已安装,就不用再安装了
sudo apt install gdb
开启编译选项
使用Debug调试,首先需要在程序编译时 加上debug选项,让cmake以debug模式编译,否则不会有gdb调试信息,无法查看源代码和设置断点等。
如果用命令行catkin_make,在输入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")
调试方法
一种是调试coredump文件,另一种是在线调试。
大多使用在线调试,而在线调试又分为 roslaunch 调试和 rosrun node调试
launch文件中添加GDB调试指令
修改ROS launch文件,在node标签中添加参数
launch-prefix="xterm -e gdb -ex run --args"
例子:
<launch>
<node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" launch-prefix="xterm -e gdb -ex run --args"/>
<node pkg="learning_topic" type="person_publisher" name="listener" output="screen" />
</launch>
运行如下:
rosrun node 的方式进行调试
rosrun --prefix 'gdb -ex run --args' [package_name] [node_name]
运行效果:
实战应用:
/**
* 该例程将发布/person_info话题,自定义消息类型learning_topic::Person
*/
#include <ros/ros.h>
#include "learning_topic/Person.h"
int main(int argc, char **argv){
ros::init(argc, argv, "person_publisher789");// ROS节点初始化
ros::NodeHandle n;// 创建节点句柄
// 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info/huati", 10);
ros::Rate loop_rate(1);// 设置循环的频率
int count = 0;
while (ros::ok()){
// 初始化learning_topic::Person类型的消息
learning_topic::Person person_msg;
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = learning_topic::Person::male;
person_info_pub.publish(person_msg);// 发布消息
ROS_INFO("Publish Person Info: name:%s age:%d sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);
//这里故意插入会引起段错误,导致程序崩溃的代码,看看gdb会输出什么
int *b = 0;
*b = 10;
loop_rate.sleep();// 按照循环频率延时
}
return 0;
}
直接使用 rosrun node 节点启动gdb的方式进行调试,发现出错的地方在 26 行,说明在此处可能有错误语法出现。
也可以直接运行可执行文件进行调试:
gdb person_publisher
指出错误的结果都是一样的。
更多参考。