ROS项目的GDB调试

news2025/7/19 2:04:03

首先安装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

指出错误的结果都是一样的。

更多参考。

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

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

相关文章

自主HttpServer实现(C++实战项目)

文章目录项目介绍CGI技术概念原理设计框架日志文件TCPServer任务类初始化与启动HttpServerHTTP请求结构HTTP响应结构线程回调EndPoint类EndPoint主体框架读取HTTP请求处理HTTP请求CGI处理非CGI处理构建HTTP响应发送HTTP响应接入线程池简单测试项目扩展项目介绍 该项目是一个基…

Python 算法交易实验53 Step2.1 Signals 信号生成

说明 上次提到了基于传统的趋势法构建一组基础信号的方法&#xff0c;并做了简单的交易测算。本次计划对方法和测算做一下Review&#xff0c;同时明确接下来基于ADBS(Step2)进行承接时需要计算的数据。 内容 1 方法回顾 传统的趋势方法(SMA-LMA)采用“短线上升且突破长线买…

Spring Security Oauth2以及整合sso

Oauth2认证 第三方认证技术方案最主要是解决认证协议的通用标准问题&#xff0c;因为要实现跨系统认证&#xff0c;各系统之间遵循一定的接口协议。 Oauth协议为用户资源授权提供了一个安全的&#xff0c;开放的而又简单的标准&#xff0c;同时&#xff0c;任何第三方都可以使用…

【Linux系统编程】08:信号量

信号量 OVERVIEW信号量1.mmap内存映射2.semget信号量获取3.semctl信号量控制4.semop信号量操作5.使用案例1.mmap内存映射 mmap映射的是磁盘中的文件&#xff0c;而共享内存是将内存映射到用户的进程空间中 原型&#xff1a;void *mmap(void *addr, size_t length, int prot, …

DHCP中继配置

1. 实验目的 熟悉DHCP中继的应用场景掌握DHCP中继的配置方法2. 实验拓扑 DHCP中继配置实验拓扑如图15-10所示: 图15-10:DHCP中继配置 3. 实验步骤 IP地址的配置AR1的配置 <Huawei>system-view

VCO pulling

这次调试项目 目前复现的问题 2.4g干扰到5g 问题就是2.4g 5g 同时发包&#xff0c;5g evm直接从37-38变成33-34 于是我对vco-pulling做了一个小结 VCO pulling是指当一个外部信号对振荡器的频率产生影响时&#xff0c;振荡器的频率将被拉动或偏移。这种现象通常会在无线电通…

SpringBoot嵌入式Servlet容器 相关学习笔记

大家都知道SrpingBoot是内嵌Servlet容器的&#xff0c;并且默认是Tomcat&#xff0c;本文主要讲一下其中原理。   首先&#xff0c;SpringBoot是支持其它容器的&#xff0c;除了Tomcat外&#xff0c;还有Undertow&#xff0c;Netty以及Jetty。并且这些容器经过封装&#xff0c…

KAT: A Knowledge Augmented Transformer for Vision-and-Language

Paper name KAT: A Knowledge Augmented Transformer for Vision-and-Language Paper Reading Note URL: https://arxiv.org/pdf/2112.08614.pdf TL;DR 2022 NAACL 论文&#xff0c;提出了 Knowledge AugmentedTransformer (KAT)&#xff0c;提出了一种同时利用显式和隐式…

记录第一次安装部署datadonphon遇到的坑和解决办法

故事开始之前&#xff0c;我在3台服务器里新建了一个abin用户&#xff0c;3台服务器都用abin和root账号做了免密登录。故事开始了......按照官网文档一顿操作猛如虎到了配置集群了。那就配置呗&#xff0c;点它。仔细阅读了提示&#xff0c;嗯&#xff0c;明白它的意思了。来吧…

Python进阶-----高阶函数->filter() 函数

目录 前言&#xff1a; filter() 函数介绍 filter() 函数使用示例 1.与循环对比 2.与lambda函数综合使用 3.使用None过滤False 4.过滤字典相关数据 前言&#xff1a; 家人们&#xff0c;当你们获取了一个序列的时候&#xff0c;想要把一些内容去掉&#xff0c;保留一部分…

《JavaEE》进程和线程的区别和联系

&#x1f451;作者主页&#xff1a;Java冰激凌 &#x1f4d6;专栏链接&#xff1a;JavaEE 目录 进程是什么&#xff1f; 线程是什么&#xff1f; 进程和线程之间的联系~ ps1&#xff1a;假设我们当前的大兴国际机场有一条登机口可以登入飞机 ps2&#xff1a;我们为…

运动员最佳匹配问题(详解)

一、问题描述 羽毛球队有男女运动员各n人。给定2个nn矩阵P和Q。 P[i][j]是男运动员i的女运动员j配对组成混合双打的男运动员竞赛优势&#xff1b;Q[i][j]是女运动员i和男运动员j配对的女运动员竞赛优势。由于技术配合和心理状态等各种因素影响&#xff0c;P[i][j]不一定等于Q[…

LearnOpenGL-光照-6.多光源

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject 文章目录前言例子代码没有聚光灯效果有聚光灯效果前言 此节目的 综合2.5投光物&#xff0c;在此节实现一个场…

超越语言界限,ChatGPT进化之路——Visual ChatGPT

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

操作系统复习

熟练掌握操作系统的定义&#xff0c;操作系统的特征&#xff0c;操作系统的功能熟练掌握多道程序设计的概念&#xff0c;单道程序设计和多道程序设计的区别&#xff0c;多道程序设计的优点熟悉操作系统接口的主要功能&#xff0c;系统调用的基本概念、类型、实现。操作系统接口…

【Mysql】库的操作

一、sql分类 1.DDL&#xff08;Data Defination Language&#xff09;数据定义语言 定义数据时候使用的sql语言 creat:建表、drop:删表、alter:改变 2.DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言 对数据进行操作的sql语言 insert:插入、delet…

【打造家庭服务器系列03】Frp 实现内网穿透

一、概述 为什么要搞frp&#xff0c;因为我们的服务器处于家里面的网络&#xff0c;是没有公网IP的&#xff0c;所以直接通过ssh连接服务器&#xff0c;此时就需要一个中转来实现转发。 二、服务端配置 - Frp Server 以腾讯云为例&#xff0c;阿里云也一样。Frp 官方文档 -…

chatPDF | 别再自己读文献了!让chatGPT来帮你读吧!~

1写在前面 自从chatGPT开放API以后&#xff0c;相关基于此的app也是层出不穷。&#x1f92a; ChatGPT API是基于OpenAI的自然语言处理模型的API。&#x1f9d0; 基于这个API&#xff0c;开发人员可以通过程序调用和使用ChatGPT模型来解决各种文本相关的任务。&#x1f609; 其实…

Ubuntu软件包管理之apt与apt-get的区别

目录apt和apt-get发展史apt和apt-get命令对比常用命令举例更新存储库索引升级已安装的包列出所有可用安装包关键字搜索安装包安装软件卸载软件查看安装包信息清理没用的依赖包清理下载的缓存包清理残余的配置文件查看安装包的依赖参考apt和apt-get发展史 Debian 使用一套名为 …

STM32—LCD1602

LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) 第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱&#xff0c;接地时对比度最…