ROS添加GDB调试

文章目录

  • 一、问题描述
  • 二、配置步骤
    • 1. debug 模式编译
    • 2. rosrun 添加GDB指令
    • 3. launch 添加GDB指令
  • 三、GDB基本命令
    • 1. 基本
    • 2. 显示被调试文件信息
    • 3. 查看/修改内存
    • 4. 断点
    • 5. 调试运行

一、问题描述

在享受ROS带来便利的同时,但因每运行出现错误,ROS不会报错,导致很难排查原因,ROS wiki 官方列出了许多可用的IDE,如 VScode,Clion 等,而这些不方便快速的调试,故整理了ROS添加GDB工具。

二、配置步骤

1. debug 模式编译

编译器有些优化会让debug无法进行。为避免这种情况,程序编译时要加上debug选项,让cmake以debug模式编译,不然可能会在gdb调试的时候不能跳转到源代码,只能进入断点。

普通的非ROS程序添加gdb调试,要在CMakeLists.txt 前面添加:

set(CMAKE_BUILD_TYPE Debug)

在输入catkin_make编译时加上一个参数:

catkin_make -DCMAKE_BUILD_TYPE=Debug

修改CMakeLists.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")

2. rosrun 添加GDB指令

终端 rosrun 添加gdb指令如下:

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

效果如下:
在这里插入图片描述
rosrun 其实类似于直接执行二进制文件 ./文件,所以我们也可以直接运行catkin_make产生的二进制文件。每一个package产生的二进制文件存放的位置在如下路径:

you_catkin_workspace/devel/lib/your_package_name

cd 进去上面的地址,在 CMakeLists.txt 里通过add_executable产生的那个二进制文件的名字(就是rosNode了).在终端中输入:

gdb node_name

在这里插入图片描述

3. launch 添加GDB指令

修改ROS launch文件,在node标签中如下指令launch-prefix="xterm -e gdb -ex run --args:

<launch><arg name="config_file" default="$(env HOME)/project/slam_learn/vins/fusions_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml" /><node pkg="vins" name="vins_node" type="vins_node" output="screen" launch-prefix="xterm -e gdb -ex run --args" args="$(arg config_file)" />
</launch>

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

commandimplication
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

在执行对应的 launch ,就会先打开一个下图右侧新的Shell界面:
在这里插入图片描述
如果使用的是Python来写ROS,则需要修改调试器为pdb,如下:

launch-prefix="xterm -e python -m pdb "

注意:未安装 xterm 工具时运行launch 时会报如下错误,sudo apt-get install xterm 安装xterm即可。
在这里插入图片描述

三、GDB基本命令

1. 基本

命令描述
gdb打开调试器
file FILE装载指定可执行文件
r代表run,从头开始运行程序直到断点。在一次debug中你可以通过用 r 来多次重新运行程序,而不必重新rosrun 或 roslaunch.
q退出debug
bt列出调用堆栈

2. 显示被调试文件信息

命令描述
info files显示被调试文件的详细信息
info func显示所有函数名称
info local显示当前函数中的局部变量信息
info prog显示被调试程序的执行状态
info var显示所有的全局和静态变量名称

3. 查看/修改内存

命令描述
p x相当于“print x”。显示当前变量 x 的值。
display x和print的区别是,x不是只显示一次就消失,而是一直显示,每次继续运行程序都会刷新。相当于VS的“watch”功能。
undisplay x停止对变量x的display
x address查看指针所指位置的值。
set x = 12 set x = y修改变量x的值。
call function()调用某函数。这个函数可以是你程序里定义的函数,甚至是标准库函数,我的理解是只要在当前位置可访问到的函数都可以调用。这是一个极其有用的功能,生生把c++用成Matlab 。

4. 断点

命令描述
bb即break。在当前行设置断点。
b45 在某行设置断点。
b functionName在某函数开始处设置断点。常用:b main 在程序开始设置断点。
watch x == 3设置条件断点。这个比VS的条件断点更方便,因为它不需要设置在哪一行!时刻监控!
info break查看当前存在的所有断点。每个断点都有自己的编号。
delete N删除编号为N的那个断点。

5. 调试运行

命令描述
n“next”。运行一行代码。 相当于VS的step over。
s“step”。运行一个指令。相当于VS的step in。n和s都可以一次运行多行,比如n 5
c“continue”。继续运行直到下一个断点。
f“finish”,运行完当前程序。相当于VS的 step out。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风电机组的振动控制

文章目录 0. 背景1. 原文记录 0. 背景 混塔机组的频率大概是目前业内遇见的比较普遍的通病。最近在了解风电机组振动控制的知识&#xff0c;看到一篇科普性质的文章&#xff0c;感觉不错&#xff0c;所以记录下来。想要看原文的点击这里。感谢原作者。 1. 原文记录

一文带你了解.NET能做什么?

前言 在DotNetGuide技术社区微信交流群经常看到有小伙伴问&#xff1a;.NET除了能写桌面应用和Web应用还能做什么&#xff1f;今天大姚将通过本篇文章来简单讲讲.NET能做哪些开发&#xff0c;对.NET感兴趣的小伙伴也可以自行领取文末附带的.NET相关学习资料。 .NET简单介绍 .…

多层派生时的构造函数和派生类的析构函数

一、多层派生时的构造函数 目录 一、多层派生时的构造函数 二、派生类的析构函数 析构函数的作用&#xff1a; 例&#xff1a;多级派生情况下派生类的构造函数 #include <iostream> #include<string> using namespace std; class Student { public:Student(int…

【SpeedAI科研小助手】2分钟解决知网维普AIGC检测

2分钟搞定AIGC率&#xff1f;还能降到0%&#xff1f; 使用方法&#xff1a; 打开SpeedAI科研小助手&#xff0c;将功能模式换成降AIGC率&#xff0c;后面可以一段一段自己改&#xff0c;也可以直接上传论文文件&#xff0c;SpeedAI直接帮你全文修改&#xff08;主打一个用户友…

HTML5 基本框架

HTML5基本的内容 文章目录 系列文章目录前言一、HTML5 基本框架二、具体框架结构三、知识补充总结 前言 HTML5的介绍&#xff1a; HTML5 是一种用于构建网页内容的标准化语言。它是 HTML&#xff08;超文本标记语言&#xff09;的第五个版本&#xff0c;引入了许多新的功能和特…

Jmeter-使用手册(_5.5版本)

JMeter是一个Java桌面应用程序&#xff0c;具有使用Swing图形API的图形界面。可以进行接口、性能等测试&#xff0c;也可以对任何数据库进行同样的测试&#xff0c;具有可移植性&#xff0c;可跨平台支持Windows&#xff0c;Linux&#xff0c;Mac上使用。 JMeter运行场景不仅可…

模仿高效网络进行目标检测——知识蒸馏

摘要 链接&#xff1a;https://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Mimicking_Very_Efficient_CVPR_2017_paper.pdf 当前的基于卷积神经网络&#xff08;CNN&#xff09;的目标检测器需要从预训练的ImageNet分类模型中初始化&#xff0c;这通常非常耗时。在本…

Java整合ELK实现日志收集 之 Elasticsearch、Logstash、Kibana

简介 Logstash&#xff1a;用于收集并处理日志&#xff0c;将日志信息存储到Elasticsearch里面 Elasticsearch&#xff1a;用于存储收集到的日志信息 Kibana&#xff1a;通过Web端的可视化界面来查看日志&#xff08;数据可视化&#xff09; Logstash 是免费且开放的服务器端数…

AI办公自动化:用kimi批量将word文档部分文件名保存到Excel中

文件夹中有很多个word文档&#xff0c;现在只要英文部分的文件名&#xff0c;保存到一个Excel文件中。 可以在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

数据集002:眼疾识别数据集 (含数据集下载链接)

说明 病理性近视&#xff08;Pathologic Myopia&#xff0c;PM&#xff09;的医疗类数据集&#xff0c;包含1200个受试者的眼底视网膜图片&#xff0c;训练、验证和测试数据集各400张。 说明&#xff1a; 如今近视已经成为困扰人们健康的一项全球性负担&#xff0c;在近视人…

斯坦福2024人工智能指数报告 1

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika、Jack Clark等人员和组织合著&#xff0c;旨在追踪、整理、提炼并可视化与人工智能&#xff08;AI&#xff09;相关各类数据&#xff0c;该报告已被大多…

RedHat9 | DNS剖析-建立子域并进行区域委派

一、实验环境 1、委派DNS服务器 域名空间由多个域构成&#xff0c;DNS提供了将域名空间划分为1个或多个区域的方法&#xff0c;这样使得管理更加方便。在域的规模增大后&#xff0c;可以为域添加附加域&#xff0c;上级域为父域&#xff0c;下级域为子域&#xff0c;下列案例…

韩顺平0基础学Java——第11天

p234-249 又一个月了&#xff0c;时间过得好快啊&#xff0c;希望支棱起来 可变参数 public int sum(int ... nums){ } 这个nums是数组 细节&#xff1a; 1可变参数可以为0个&#xff0c;或任意个 2可变参数的实参可以为数组 3可变参数的本质就是数组 4可变参数可以和普通…

Golang | Leetcode Golang题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; type pair struct {node *TreeNodeleft int }func pathSum(root *TreeNode, targetSum int) (ans [][]int) {if root nil {return}parent : map[*TreeNode]*TreeNode{}getPath : func(node *TreeNode) (path []int) {for ; node ! nil; no…

冯喜运:5.27黄金暴跌大阴后出现“暂定符”今日黄金原油操作策略

【黄金消息面分析】&#xff1a;金价虽然有大阴线暴跌&#xff0c;但依然属于超买后的调整而非熊市&#xff0c;对中长线投资者来说只是市场洗牌。因此&#xff0c;在出现企稳迹象之后&#xff0c;随时关注反弹时机的启动。未来几日&#xff0c;黄金空头可能在进一步发力之前需…

【数据结构与算法 经典例题】相交链表

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录 一、问题描述 二、解题思路 方法一:双循环对比法 方…

LangChain llamaindex

LangChain 参考&#xff1a; 全流程 | Windows 系统本地部署开源模型阿里通义千问 QWEN 1.5&#xff0c;结合 LangChain-Chatchat 框架和向量数据库 FAISS、Milvus - 知乎

redis数据操作相关命令

1.list操作 1.1 rpush rpush&#xff1a;新的元素添加到list最右边 #从右边依次往List添加1,2,3 RPUSH name 1 RPUSH name 2 RPUSH name 3#查看列表&#xff1a;返回 1,2,3 LRANGE name 0 -1结果如下&#xff1a; 1.2 lpush lpush&#xff1a;新加的元素在list最左边 #从…

ElasticSearch学习篇12_《检索技术核心20讲》基础篇

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243 课程分为基础篇、进阶篇、系统案例篇 主要记录企业课程学习过程课程大纲关键点&#xff0c;以文档形式记录笔记。 内容 检索技术&#xff1a;它是更底层的通用技术&#xff0c…

GVM: Golang多版本管理利器

本文介绍了 Go Version Manager 的功能和使用方法&#xff0c;介绍了如何通过 GVM 在系统上安装和管理多个 Go 语言版本。原文: GVM: Go Version Manager, for Golang manage multiple versions Go 版本管理器&#xff08;GVM&#xff0c;Go Version Manager&#xff09;是一款…