当前位置: 首页 > article >正文

ubuntu下gdb调试ROS

参考:

使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客

https://blog.csdn.net/weixin_45031801/article/details/134399664?spm=1001.2014.3001.5506

一、调试准备

1.1 CMakeLists改动

注释文件中的

set(CMAKE_BUILD_TYPE "Release") #构建类型:发行版本

在这句位置处加入

SET(CMAKE_BUILD_TYPE "Debug")#构件类型:调试版本
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")#关闭优化便于调试、增加生成调试信息

正常编译工作空间

catkin_make

二、在vscode下调试

2.1 设置c_cpp_properties.json

其中${workspaceFolder}指启动vscode所在文件夹,确定包含所有文件的路径即可

{
    "configurations": [
        {
            "name": "ROS",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/**",
                "/opt/ros/noetic/include/**",
                "${workspaceFolder}/devel/include",
                "/opt/ros/noetic/include"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-clang-x64",
            "compileCommands": "${workspaceFolder}/build/compile_commands.json"
        }
    ],
    "version": 4
}

2.2 设置launch.json

{
  "version": "0.2.0",
  "configurations": [
    
      {
          "name": "ROS GDB", // 配置名称,将会在调试配置下拉列表中显示
          "type": "cppdbg",  // 调试器类型 该值自动生成
          "request": "launch",  // 调试方式,还可以选择attach
          "program": "${workspaceFolder}/devel/lib/……", //要调试的程序(完整路径,支持相对路径)即可执行文件路径
          "args": [],  // 传递给上面程序的参数,没有参数留空即可
          "stopAtEntry": false,  // 是否停在程序入口点(停在main函数开始)
          "cwd": "${workspaceRoot}",  // 调试程序时的工作目录
          "environment": [], //针对调试的程序,要添加到环境中的环境变量. 例如: [ { "name": "squid", "value": "clam" } ]
          "externalConsole": false,   //如果设置为true,则为应用程序启动外部控制台。 如果为false,则不会启动控制台,并使用VS Code的内置调试控制台。
          "MIMode": "gdb",  // VSCode要使用的调试工具
          "setupCommands": [
              {
                  "description": "Enable pretty-printing for gdb",
                  "text": "-enable-pretty-printing",
                  "ignoreFailures": true
              }
          ]
      }
  ]
}

2.3 设置tasks.json

{
  "tasks": [
    {
      "type": "cppbuild",//任务类型,可以取cppbuild、shell、process,三种执行时稍有差异,这里选择默认cppbuild。
      "label": "build",//任务标签(标记),也即任务名称,任务名称要和launch.json里的"preLaunchTask"值对应一致。
      "command": "/usr/bin/g++",//编译器及其路径,.c用gcc编译器,cpp用g++编译器
      "args": [
        "-fdiagnostics-color=always",
        "-g",//生成和调试有关的信息,launch.json会用到这些信息。
        "${workspaceFolder}/src/……/*.cpp",//编译当前打开的.c(或.cpp)文件。
        "-o",//指定编译的输出
        "${workspaceFolder}/build"
      ],
      "options": {
        "cwd": "${workspaceFolder}"//当前工作目录(路径)。
      },
      "problemMatcher": ["$gcc"],//使用gcc的问题匹配器。
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

2.4 启动vscode调试

vscode左侧边栏选择运行和调试,选择launch.json中配置好的配置名称即可开始debug

三、在gdb终端下调试

1.1 终端gdb优缺点

缺点:

不如vsode可视化方便,全部需要命令操作

优点:

能够附加到已运行的程序上调试,而不需要作额外配置,vscode做不到读取rosparam调试,需要手动给值,而这个不需要手动给,尤其在launch多节点调试时

1.2 调试方法

首先正常启动节点或launch,使其运行,然后找到进程id号列表

ps aux | grep 可执行文件名

若是多节点运行,则会存在多个命名空间及其唯一的id,复制想要调试的id到${id}处,一定要给sudo权限

sudo gdb -p ${id}

出现以下界面证明成功,点击回车即可进入gdb

1.3 gdb基本命令

退出gdb调试

两者都可
q
quit

设置断点,关键字b/break + 程序名 + : + 行号,如

两者都可
b main.cpp:5
break main.cpp:5

查看所有断点
info breakpoints

删除指定断点,如2
d 2

删除所有断点
d breakpoints

使2号断点有效/无效
enable/disable b 2

继续执行c,停止执行ctrl+c

从一个断点运行到下一个断点处
c

若执行到断点处,自动停止继续执行

此时可查看变量,print xxx可显示一次,display xxx可在每次打断后都自动跟踪显示,假设变量flag

print flag
display flag

取消跟踪flag
undisplay flag

手动设定某变量值 ,如flag

set flag = 1

 线程查看

显示当前线程
thread
显示所有线程,其中带*为当前线程
info threads
切换到第3线程
thread 3

查看栈

bt

 


http://www.kler.cn/a/443922.html

相关文章:

  • 【Prompt Engineering】7 聊天机器人
  • 探索 Python编程 调试案例:计算小程序中修复偶数的bug
  • 【JavaEE初阶】线程 和 thread
  • fastdds:idl
  • 3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版
  • 二叉搜索树Ⅲ【东北大学oj数据结构8-3】C++
  • 【C++算法】47.分治_归并_排序数组
  • 云原生周刊:Kubernetes v1.32 正式发布
  • apache应用(客户机地址限制、用户授权限制、日志分割、AWStats日志分析)
  • 【Apache Paimon】-- 10 -- Paimon 0.9.0 集成 Hive 3.1.3
  • python学习 洛谷P2141 [NOIP2014 普及组] 珠心算测验
  • Java操作Redis-Jedis
  • 高德地图离线加载解决方案(内网部署)+本地地图瓦片加载
  • []2024年第五届蓝桥杯全国软件和信息技术专业人才大赛(Web 应用开发)
  • c++中如何保持结构体的线程安全?3D坐标的线程安全:从理论到最优解
  • 【myXdb.stop()关闭时保存数据流程分析】xdb关服时数据落地源码
  • 基于阿里云日志服务的程序优化策略与实践
  • 关于目标检测YOLO 各版本区别v1-v11/X/R/P
  • go语言并发读写数据队列,不停写的同时,一次最多读取指定量数据(逐行注释)
  • 【自动驾驶】Ubuntu20.04安装ROS1 Noetic
  • 在C#中,可以通过使用委托(delegate)或者是事件(event)来将方法作为参数传递。
  • Redis篇-14--数据结构篇6--Set内存模型(整数集合intset,哈希表hashtable)
  • 爬虫可能会遇到哪些反爬措施?
  • 【AI热点】小型语言模型(SLM)的崛起:如何在AI时代中找到你的“左膀右臂”?
  • 在 Go 中利用 ffmpeg 进行视频和音频处理
  • Java web概述