ROS添加GDB调试

news2024/11/17 9:48:11

文章目录

  • 一、问题描述
  • 二、配置步骤
    • 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.coloradmin.cn/o/1700376.html

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

相关文章

Python筑基之旅-文件(夹)操作和流

目录 一、文件操作 1、文件打开与关闭 2、文件读写 3、文件操作模式 4、文件编码 二、文件夹操作 1、创建文件夹 2、删除文件夹 3、改变当前工作目录 4、获取当前工作目录 5、检查文件/文件夹是否存在 6、遍历文件夹 三、文件路径操作 1、获取绝对路径 2、构建完…

Android 逆向学习【1】——版本/体系结构/代码学习

#Android 历史版本 参考链接&#xff1a;一篇文章让你了解Android各个版本的历程 - 知乎 (zhihu.com) 三个部分&#xff1a;api等级、版本号、代号&#xff08;这三个东西都是指的同一个系统&#xff09; API等级&#xff1a;在APP开发的时候写在清单列表里面的 版本号&…

【Springboot系列】SpringBoot 中的日志如何工作的,看完这一篇就够了

文章目录 强烈推荐引言Spring Boot 中的日志是怎么工作日志框架选择配置文件日志级别自定义日志配置集成第三方日志库实时监控和日志管理 Log4j2工作原理分析1. 核心组件2. 配置文件3. Logger的继承和层次结构4. 日志事件处理流程5. 异步日志 总结强烈推荐专栏集锦写在最后 强烈…

【MySQL进阶之路 | 基础篇】MySQL新特性 : 窗口函数

1. 前言 (1). MySQL8开始支持窗口函数. 其作用类似于在查询中对数据进行分组(GROUP BY)&#xff0c;不同的是&#xff0c;分组操作会把分组的结果聚合成一条记录. 而窗口函数是将结果置于每一条数据记录中. (2). 窗口函数还可以分为静态窗口函数和动态窗口函数. 静态窗口函数…

堆(建堆算法,堆排序)

目录 一.什么是堆&#xff1f; 1.堆 2.堆的储存 二.堆结构的创建 1.头文件的声明&#xff1a; 2.向上调整 3.向下调整 4.源码&#xff1a; 三.建堆算法 1.向上建堆法 2.向下建堆法 四.堆排序 五.在文件中Top出最小的K个数 一.什么是堆&#xff1f; 1.堆 堆就…

AIGC产业链上下游解析及常见名词

文章目录 AIGC上游产业链 - 基础层AIGC中游产业链 - 大模型层与工具层AIGC下游产业链 - 应用层AIGC产业链常见的名词表 在上一章节为大家介绍了 “大模型的不足与解决方案” &#xff0c;这一小节呢为大家针对AIGC的相关产业进行一个拆解&#xff0c;以及相关的一些专业名词做出…

RK3568笔记二十六:音频应用

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 音频是我们最常用到的功能&#xff0c;音频也是 linux 和安卓的重点应用场合。 测试使用的是ATK-DLR3568板子&#xff0c;板载外挂RK809 CODEC芯片&#xff0c;RK官方驱动是写好的&#xff0c;不用在自己重新写。…

C语言 | Leetcode C语言题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; int** ret; int retSize; int* retColSize;int* path; int pathSize;typedef struct {struct TreeNode* key;struct TreeNode* val;UT_hash_handle hh; } hashTable;hashTable* parent;void insertHashTable(struct TreeNode* x, struct Tr…

第八篇【传奇开心果系列】Python微项目技术点案例示例:以微项目开发为案例,深度解读Dearpygui 编写图形化界面桌面程序的优势

传奇开心果博文系列 系列博文目录Python微项目技术点案例示例系列 博文目录前言一、开发图形化界面桌面程序的优势介绍二、跨平台特性示例代码和解析三、高性能特性示例代码和解析四、简单易用特性示例代码和解析五、扩展性强示例代码和解析六、现代化设计示例代码和解析七、知…

【PB案例学习笔记】-09滚动条使用

写在前面 这是PB案例学习笔记系列文章的第8篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee…

如何使用KNN

导入文件和库 加载数据集、拆分数据集 训练模型 预测 打印结果

用C#调用SAP 的WebServices接口

文章目录 用C#调用SAP 的WebServices接口创建C#的项目添加窗体添加引用在表单的装载事件里编写代码运行结果SAP的RFC函数 用C#调用SAP 的WebServices接口 创建C#的项目 添加窗体 添加引用 在表单的装载事件里编写代码 using System; using System.Collections.Generic; using …

MicroLED:苹果对知识产权的影响

Yole的洞察揭示&#xff0c;MicroLED IP在经历了七年的爆炸式增长后&#xff0c;已然屹立于行业之巅。苹果公司&#xff0c;作为微LED领域的先行者&#xff0c;早在2014年便敏锐地捕捉到Luxvue这家初创公司的潜力&#xff0c;将其纳入麾下&#xff0c;引发了业界的广泛关注。然…

204页 | MES项目需求案例方案:效率+精细化+品质+数据互联(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 MES项目需求案例方案 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&…

上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 mcu一般有两个用途,一个是控制,一个是非控制。控制类的应用一般要求实时性比较高,什么时候做什么,都是有严格的时间要求的。而非控制类的应用,则要求实现尽可能多的功能,比如…

如何调用通义千问大模型API

目录 登录阿里云 大模型服务平台百炼 登录控制台 QWen Long QWen 通义千问开源系列 大语言模型 OpenAI接口兼容 登录阿里云 阿里云-计算&#xff0c;为了无法计算的价值 大模型服务平台百炼 降价信息&#xff1a; 登录控制台 右上角取得API key 创建Key QWen Long qw…

03.tomcat环境搭建

上传软件包 JDK #man bash #PATH 存放命令的路径 ## ls #加入环境变量&#xff0c;注意&#xff1a;EOF的单引号的意思就是追加到文件中的内容带有变量的不做解析&#xff0c;否则会被解析 cat >>/etc/profile <<EOF export JAVA_HOME/application/jdk export PAT…

修改元组元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 场景模拟&#xff1a;伊米咖啡馆&#xff0c;由于麝香猫咖啡需求量较大&#xff0c;库存不足&#xff0c;店长想把它换成拿铁咖啡。 实例08 将麝香猫…

Python 开心消消乐

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

硬盘录像机DVR如何连接到外网的视频监控接入网关(国标网关)

目录 一、要求 二、工作准备 三、接入 1、查看SIP服务器ID号和相关国标对接参数&#xff0c;如下&#xff1a; 2、DVR国标参数配置 3、进行连接 &#xff08;1&#xff09;设备接入 &#xff08;2&#xff09;配置通道 &#xff08;3&#xff09;通道接入 &#xff0…