Gdb 调试核心已转存储-调试VINS-FUSION/ORB-SLAM

2023-11-18

GDB调试C++工程非ROS

1.通过运行可执行程序来进入gdb

CMakeLists中的修改:

 SET(CMAKE_BUILD_TYPE "Debug")
 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")#用于进行gdb调试
 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

        gdb调试指令

 

  • (gdb) gdb ./Examples/RGB-D/rgbd_tum  //运行可执行文件
    (gdb) set args /home/ubuntu/Documents/03.Semantic_Mapping_on_ORBSLAM2-master/Vocabulary/ORBvoc.txt /home/ubuntu/Documents/03.Semantic_Mapping_on_ORBSLAM2-master/Examples/RGB-D/TUM1.yaml /home/ubuntu/shard_read/rgbd_dataset_freiburg1_xyz /home/ubuntu/shard_read/rgbd_dataset_freiburg1_xyz/associate.txt  //给出参数
    
    //打断点 注意此时程序还未运行
    (gdb) b rgbd_tum.cc:106  //在会编译成可执行文件的源文件cpp中加断点
    (gdb) b Global.cc:25 //会提示未来编译成shared library的源文件cpp中加断点
    No source file named Global.cc.
    Make breakpoint pending on future shared library load? (y or [n]) y
    
    (gdb) run //程序开始运行
    Breakpoint 2, ORB_SLAM2::Global::init (this=0x7fffffffd526, 
        strSettingsFile=...)
        at /home/ubuntu/Documents/03.Semantic_Mapping_on_ORBSLAM2-master/src/Global.cc:26
    warning: Source file is more recent than executable.
    26	}
    (gdb) print Global::PORT  //打印变量
    $1 = 8080
    (gdb) c //直接运行到下一个断点
    Continuing.
    Connect successfully! client iP: 127.0.0.1, port: 8080
    [New Thread 0x7fffb2902700 (LWP 4336)]
    [New Thread 0x7fffb2101700 (LWP 4337)]
    

 gdb基础功能使用

c/continue         # 向下运行到下一个断点处
n/next             # 执行下一行代码,不进入调用的函数,直接返回结果
s/step             # 执行下一行代码,进入调用的函数
finish             # 跳出函数体
until    		   # 跳出当前循环 在执行完循环体内的最后一条语句之后执行 until,才可以跳出循环
info breakpoints
info threads

 

 

2.通过运行core文件来进入gdb      

CMake的时候增加生成core的编译选项

在文件 CMakeLists.txt添加下面一条语句

 set(CMAKE_CXX_FLAGS_DEBUG "-O3 -Wall -g")  //以debug形式编译,可以生成core文件

ulimit -a //查询core文件大小

 这里的size的单位是blocks,一般1block=512bytes,

ulimit –c 4  (注意,这里的size如果太小,则可能不会产生对应的core文件,笔者设置过ulimit –c 1的时候,系统并不生成core文件,并尝试了1,2,3均无法产生core,至少需要4才生成core文件)。

我的ubuntu系统改完大小以后直接在打开终端的目录下生成core文件。

但根据百度出来的结果,很可能会在其他路径下生成相关文件。

但当前设置的ulimit只对当前会话有效,若想系统均有效,则需要进行如下设置:

Ø  在/etc/profile中加入以下一行,这将允许生成coredump文件

ulimit-c unlimited  //会在当前的文件目录下生成core文件

Ø  在rc.local中加入以下一行,这将使程序崩溃时生成的coredump文件位于/data/coredump/目录下:

echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern 

注意rc.local在不同的环境,存储的目录可能不同,susu下可能在/etc/rc.d/rc.local

 ROS 配置gdb进行调试查看最后一行出错的代码

  • rosrun的形式
rosrun --prefix 'gdb -ex run --args' [package_name] [node_name] 

VINS-FUSION中

rosrun --prefix 'gdb -ex run --args' vins vins_node /home/zhou/1130_vinsfusion/src/VINS-Fusion-master/config/kitti_stereo/kitti_mono_imu_config.yaml
  • roslaunch的形式 

修改ROS launch文件,在node标签中添加一句话 

launch-prefix="xterm -e gdb -ex run --args "

<node pkg="waypoint_follower" type="pure_persuit" name="pure_pursuit" output="screen" launch-prefix="xterm -e gdb -ex run --args"> 
</node>

 附: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:
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-prefix后面的内容可以如rosrun --prefix 'gdb -ex run --args' 放到引号里进行使用

参考链接:ROS在线调试(使用GDB)_lovely_yoshino的博客-CSDN博客_roslaunch 调试

   roslaunch/Tutorials/Roslaunch Nodes in Valgrind or GDB - ROS Wiki

C++ 基础:

override只是C++保留字,不是关键字,这意味着只有在正确的使用位置,oerride才启“关键字”的作用,其他地方可以作为标志符

class Base {
virtual void f();
};

class Derived : public Base {
void f() override; // 表示派生类重写基类虚函数f
void F() override;//错误:函数F没有重写基类任何虚函数
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gdb 调试核心已转存储-调试VINS-FUSION/ORB-SLAM 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 法律信息爬虫:Python爬虫获取法律文件和法规信息

    目录 第一部分 选择目标网站 第二部分 分析网站结构和查询方式
  • 静态分析分析

    软件静态分析概念 静态分析通常是指不执行程序代码而寻找代码中可能存在的错误或评估程序代码的过程 被测对象是各种不软件相关的有必要测试的产物 如文档 源代码等 通过扫描程序正文对程序的数据流和控制流等进行分析 找出系统的缺陷 得出测试报告 不
  • 网络安全实验室CTF练习部分题目(持续更新)

    1 脚本关 微笑一下 过关地址 http lab1 xseclab com base13 ead1b12e47ec7cc5390303831b779d47 index php 查看源代码 include flag php smile 1 i
  • webpack 5 模块联邦实现微前端疑难问题解决

    webpack 5 模块联邦实现微前端疑难问题解决 说明 webpack 5 新增 Module Federation 模块联邦 功能 他可以帮助将多个独立的构建组成一个应用程序 不同的构建可以独立的开发与部署 借助模块联邦我们可以一定程度
  • 什么是思维导图?6 个开源免费的思维导图软件

    目录 15款思维导图工具推荐 什么是思维导图 6 个开源免费的思维导图软件 当前推荐 Freeplane 离线应用 有免安装版本 跨平台 目前 2023年 还在更新中 下载 https sourceforge net projects fr
  • 【CentOS7】-bash: ifconfig: 未找到命令

    安装完CentOS7并配置完网络之后 使用ifconfig命令进行测试出现以下情况 原因分析 缺少ifconfig组件 那么我们可以下载相关的网络组件来解决 yum install y net tools 一波未平 一波又起 出现了一下问题
  • 李飞飞深度学习与计算机视觉——KNN(KNearestNeighbor)

    之前为了熟悉机器学习的东西去搞kaggle的东西 然后就从Titanic入门咯 结果发现并没有对机器学习的东西有深入的理解 做数据挖掘的时候直接调用sklearn里面的框架 根本不用去想机器学习的公式的运用和基础的实现 想用SVM就直接fr
  • Object.defineProperty

    Object defineProperty Object defineProperty obj prop descriptor obj 要在其上定义属性的对象 prop 要定义或修改的属性的名称 descriptor 将被定义或修改的属性描
  • 登录界面测试用例设计

    登录界面测试用例设计 一 界面测试点 1 界面的设计风格是否与UI的设计风格统一 2 界面中的文字简洁易懂 3 界面中没有错别字 二 用户名与密码在输入时 要考虑 1 正确的用户名与正确的密码 2 正确的用户名与错误的密码 3 错误的用户名
  • 腾讯云前端面经

    腾讯云招聘一共四面 第一面是你以后的同事面试 主要考察基础知识 第二面是以后的直属领导 会考察基础原理 以及和职位的匹配度 三面是主管 考察项目等整体 四面为hr面试 一面 一面都比较基础 涉及js vue和网络安全 1 自我介绍 单纯的自
  • 如何使用Go Module代理

    简介 在我们使用Go Module时 golang org x中的文件因为撞墙无法下载 通过改变GOPROXY环境变量可以指定下载源 地址 https mirrors aliyun com goproxy 阿里云的代理仓 https gop
  • QT 帮助文档 使用方法

    我们使用 Qt 帮助文档 主要分为这么几步 1 类使用的相关介绍 2 查看所用部件 类 的相应成员函数 功能 参数 返回值 3 查看部件的信号 4 查看部件的事件 所对应的虚函数如何编写 1 类使用的相关介绍 光标移动到类名字的地方 接着按
  • python 爬虫调用 js 的库之 execjs

    python 爬虫调用 js 的库之 execjs 针对现在大部分的网站都是使用 js 加密 js 加载的 并不能直接抓取出来 这时候就不得不使用一些三方类库来执行 js 语句 1 安装 pip install PyExecJS 2 运行环
  • 你是否看到过如此有趣的AI网站?

    1 营销文案 CopyAI Create Marketing Copy In Seconds 2 美化ppt设计 https www beautiful ai 3 图片修改 https hotpot ai 4 照片变视频 https www
  • shell 多行注释详解

    在我们写 shell 脚本的时候 特别在调试的时候经常需要注释多行命令 但在每一行前输入 显得有些麻烦 基于 shell 命令的灵活性 我们可以使用下面的方法 方法一 这是比较稳妥的作法 可以采用 HERE DOCUMENT 特性 实现多行
  • android应用程序版本管理

    一 版本的主要功能说明 在应用程序的升级 维护策略中 版本是一个关键的组成部分 主要体现在以下几个方面中 1 用户需要了解在他们的设备上所安装的应用程序的版本的特定信息 以及已安装程序的升级版本可用的情况 2 其他应用程序 作为同一个套件中
  • AD20铺铜显示和隐藏的设置

    如果只想隐藏当前选中的铜皮 那么就选中对应需要隐藏的铜 然后鼠标右击 在弹出的对话框中选择 铺铜操作 隐藏选中铺铜 需要隐藏一部分铜皮 即打开铺铜管理器 选择菜单栏中 工具 铺铜 铺铜管理器 在弹出的铺铜管理器对话框中 想将哪些铜皮去进行隐
  • 招行卡中心服务端开发【已offer】

    流程 4 2投递简历 4 9笔试 4 15一面 4 22二面 4 28offer 笔试 卡中心笔试题量偏少 16道选择 两道编程 选择题范围很广 涉及了java c 设计模式 概率统计 信息论与编码 数据库 操作系统 计网等等等等知识点 编
  • C/C++ &与&&

    表示逻辑与的意思 即为and 当运算符两边的表达式的结果都为true时 整个运算结果才为true 否则 只要有一方为false 则结果为false 比如 12 23的结果就是1 12 1 的结果是1 123 0的结果就是0 还具有短路的功能
  • Gdb 调试核心已转存储-调试VINS-FUSION/ORB-SLAM

    GDB调试C 工程非ROS 1 通过运行可执行程序来进入gdb CMakeLists中的修改 SET CMAKE BUILD TYPE Debug SET CMAKE CXX FLAGS DEBUG ENV CXXFLAGS O0 Wall