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调试
修改ROS launch文件,在node标签中添加参数
launch-prefix="xterm -e gdb -ex run --args"
例子:
运行如下:
rosrun --prefix 'gdb -ex run --args' [package_name] [node_name]
运行效果:
/*** 该例程将发布/person_info话题,自定义消息类型learning_topic::Person*/
#include
#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,队列长度10ros::Publisher person_info_pub = n.advertise("/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
指出错误的结果都是一样的。
更多参考。