ubuntu进行C++的调试

方法一:gdb调试

作用: GDB 是 GNU 调试器,用于调试 C/C++ 程序。它可以在命令行中使用,提供强大的调试功能。
集成: GDB 可以独立于 VSCode 使用,你可以在终端中直接运行 GDB 来调试程序。
使用示例:编译程序时使用 -g 选项以包含调试信息,例如 g++ -g your_file.cpp -o your_executable。在终端中运行 gdb ./your_executable 启动 GDB。使用 GDB 命令(如 run, break, next, print 等)进行调试。
  • 编译
g++ -o dbow_example dbow.cpp `pkg-config --cflags --libs opencv4`
  • 调试
gdb ./dbow_example

gdb调试指南

使用 GDB(GNU 调试器)检测程序中的内存错误可以通过以下步骤进行:

1. 编译程序

g++ -o dbow_example dbow.cpp `pkg-config --cflags --libs opencv4`

2. 启动gdb程序

sudo su
gdb ./dbow_example

3. 设置端点

break function_name

4. 运行程序

运行程序,直到遇到断点:

run
  • 如果执行文件需要命令行参数
run param_1 param2

5. 检查变量

在断点处,可以检查变量的值,查看指针是否指向有效的内存地址:

print variable_name

6. 单步执行

使用单步执行命令逐行执行代码,以观察程序的行为:

step  # 进入函数
next  # 执行下一行,不进入函数

7. 检查内存

可以使用 print 命令查看指针指向的内存内容:

print *pointer_variable

8. 使用 Valgrind

虽然 GDB 可以帮助调试,但对于内存错误,使用 Valgrind 可能更有效。Valgrind 是一个专门用于检测内存错误的工具。可以使用以下命令运行程序:

valgrind --leak-check=full ./my_program

Valgrind 会报告内存泄漏、越界访问等问题。

9. 退出 GDB

完成调试后,可以使用以下命令退出 GDB:

quit

总结

GDB 是一个强大的调试工具,可以帮助你逐步检查程序的执行过程,发现潜在的内存错误。结合 Valgrind 使用,可以更全面地检测和修复内存相关的问题。

实战:corrupted size vs. prev_size 已中止 (核心已转储)

link
执行gdb和run命令后

Thread 9 "dbow_example" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffe60006c0 (LWP 9494)]
0x00007ffff72a9acf in unlink_chunk (p=p@entry=0x7fff8c03a6f0, av=0x7fff8c000030)at ./malloc/malloc.c:1610
warning: 1610	./malloc/malloc.c: 没有那个文件或目录
  • 执行backtrace
#0  0x00007ffff72a9acf in unlink_chunk (p=p@entry=0x7fff8c03a6f0, av=0x7fff8c000030)at ./malloc/malloc.c:1610
#1  0x00007ffff72ac1c5 in _int_malloc (av=av@entry=0x7fff8c000030, bytes=bytes@entry=8836)at ./malloc/malloc.c:4381
#2  0x00007ffff72ad6e4 in __GI___libc_malloc (bytes=8836) at ./malloc/malloc.c:3336
#3  0x00007ffff7a78629 in cv::fastMalloc(unsigned long) ()from /lib/x86_64-linux-gnu/libopencv_core.so.406
#4  0x00007ffff7aabf75 in cv::utils::BufferArea::commit() ()from /lib/x86_64-linux-gnu/libopencv_core.so.406
#5  0x00007ffff7effadb in ?? () from /lib/x86_64-linux-gnu/libopencv_features2d.so.406
#6  0x00007ffff7f01f17 in ?? () from /lib/x86_64-linux-gnu/libopencv_features2d.so.406
#7  0x00007ffff7ef42d6 in ?? () from /lib/x86_64-linux-gnu/libopencv_features2d.so.406
#8  0x00007ffff7bd90da in ?? () from /lib/x86_64-linux-gnu/libopencv_core.so.406
#9  0x00007ffff7bcf42e in ?? () from /lib/x86_64-linux-gnu/libopencv_core.so.406
#10 0x00007ffff7be50b5 in ?? () from /lib/x86_64-linux-gnu/libopencv_core.so.406
#11 0x00007ffff6b972bb in ?? () from /lib/x86_64-linux-gnu/libtbb.so.12
#12 0x00007ffff6b8cda5 in ?? () from /lib/x86_64-linux-gnu/libtbb.so.12
#13 0x00007ffff729ca94 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:447
#14 0x00007ffff7329c3c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78

next

  • 可能是opencv::Matvector<int>拷贝的问题

方法二:VSCode自带拓展插件

blog

launch.json解释

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(gdb) Launch","type": "cppdbg","request": "launch","program": "enter program name, for example ${workspaceFolder}/src/test","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "Set Disassembly Flavor to Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}]}]
}

这段 launch.json 配置文件是 Visual Studio Code (VSCode) 中用于调试 C++ 代码的设置。下面是对各个字段的解释:

  1. version: 该字段指定了配置文件的版本。在这里是 “0.2.0”,表示使用的配置格式版本。

  2. configurations: 这是一个数组,包含了一个或多个调试配置。在这个例子中,只有一个配置。

  3. name: 该字段是配置的名称,显示在调试配置下拉菜单中。在这里是 “(gdb) Launch”,表示使用 GDB 调试器进行调试。

  4. type: 指定调试器的类型。在这里是 “cppdbg”,表示使用 C++ 调试器。

  5. request: 指定调试请求的类型。在这里是 “launch”,表示启动一个新的调试会话。

  6. program: 这是要调试的程序的路径。在这里需要填写程序的实际路径,例如 ${workspaceFolder}/src/test,其中 ${workspaceFolder} 是当前工作区的根目录。

  7. args: 这是传递给程序的命令行参数。当前为空数组,表示没有参数。

  8. stopAtEntry: 该字段指定调试器是否在程序入口处停止。设置为 false 表示不在入口处停止。

  9. cwd: 该字段指定调试时的当前工作目录。在这里使用 ${fileDirname},表示当前文件的目录。

  10. environment: 这是一个数组,用于设置环境变量。当前为空数组,表示没有额外的环境变量。

  11. externalConsole: 该字段指定是否使用外部控制台来运行程序。设置为 false 表示使用内置终端。

  12. MIMode: 指定调试器的模式。在这里是 “gdb”,表示使用 GDB 调试器。

  13. setupCommands: 这是一个数组,包含在调试会话开始时要执行的命令。这里有两个命令:

    • 第一个命令启用 GDB 的美化打印功能,便于查看复杂数据结构。
    • 第二个命令设置反汇编的风格为 Intel 格式。
  14. ignoreFailures: 该字段指定如果设置命令失败,是否忽略错误。在这里设置为 true,表示即使命令失败也不会中断调试会话。

总的来说,这个配置文件定义了如何在 VSCode 中使用 GDB 调试 C++ 程序的详细设置。

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

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

相关文章

word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法

目录 问题描述解决方案 问题描述 解决方案 打开C盘找到路径C:\Users\Administrator\AppData\Roaming\Microsoft\Word\STARTUP或者在everything中搜索“Microsoft\Word\STARTUP”删除NEWebWordAddin.dotm文件即可正确打开word。

虚拟机Centos下安装Mysql完整过程(图文详解)

目录 一. 准备工作 1. 设置虚拟机静态IP 2. 卸载Mysql 3. 给CentOS添加rpm源 二. 安装MySQL 1. 安装mysql服务 2. 启动mysql服务 3. 开启MySQL开机自启动 4. 查看mysql服务状态 5. 查看mysql初始密码 6. 登录mysql &#xff0c;修改密码 7. 允许外部访问MySQL数据库…

VScode 只能运行c,运行不了c++的解决问题

原文链接&#xff1a;Vscode只能运行c&#xff0c;运行不了c的解决方法 VScode 只能运行c&#xff0c;运行不了c&#xff0c;怎么回事呢&#xff0c;解决问题&#xff1a; 在tasks.json中加上“"-lstdc"”&#xff0c; 这样之后 要重启VScode&#xff0c;点击链接…

driftingblues6靶机

打开靶场 查看页面源代码&#xff0c;最下面有一个注释&#xff0c;提供了一个网址 vmlist.github.io&#xff0c;我们去访问一下 这里是一个github页面&#xff0c;提供攻防虚拟机的下载&#xff0c;对我们解题并没有什么有用的信息&#xff0c;我们再去扫描端口 发现只有80端…

YOLOv5部署到web端(flask+js简单易懂)

文章目录 前言最终实现效果图后端实现 主界面检测函数检测结果显示 前端实现 主界面(index.html&#xff09;显示图片界面 总结 前言 最近&#xff0c;老板让写一个程序把yolov5检测模型部署到web端&#xff0c;在网页直接进行目标检测。经过1个星期的努力&#xff0c;终于实…

基本算法——聚类

目录 创建工程 加载数据 聚类算法 评估 完整代码 结论 相比于有监督的分类器&#xff0c;聚类的目标是从一组未打标签的数据中识别相似对象组。它可 以用于识别同类群体的代表性样本&#xff0c;找到有用与合适的分组&#xff1b;或者找到不寻常的样本&#xff0c;比如 异…

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面&#xff0c;在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面&#xff0c;在该界面我们可以选择不同的系统操作系统来下载对应版…

【Rust自学】8.4. String类型 Pt.2:字节、标量值、字形簇以及字符串的各类操作

8.4.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构&#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的&#xff0c;这也意味着这些集合的数据大小无需在编…

1、pycharm、python下载与安装

1、去官网下载pycharm 官网&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间&#xff0c;去下载python 进入官网地址&#xff1a;https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…

静默模式下安装Weblogic 14.1.1.0.0

目录 一、下载weblogic安装包二、安装JDK三、安装weblogic1、创建weblogic用户2、创建weblogic的安装目录3、上传并解压weblogic安装包4、创建 oraInst.loc 文件5、创建 wls.rsp 响应文件6、静默安装weblogic7、创建域8、启动Weblogic9、设置防火墙规则,以便其他服务器访问10、…

Windows安装Confluence详解

Confluence官网下载地址&#xff1a;https://www.atlassian.com/software/confluence/download-archives 建议安装confluence版本下载5.0-7.0之间&#xff0c;比较稳定一点&#xff0c;我安装的是6.8.2版本 centos7系统和阿里云服务安装后太卡了&#xff0c;果断放弃 Conflu…

Unity is running as administrator解决办法

每次打开Unity项目都会有这个弹窗 解决办法&#xff1a; 打开本地安全策略 - 安全选项 &#xff0c;把 用户账户控制&#xff1a;以管理员批准模式运行所有管理员 用户账户控制&#xff1a;用于内置管理员账户的管理员批准模式 改成已启用就行

springboot+vue实现SSE服务器发送事件

思路 一个基于订阅发布机制的SSE事件。客户端可以请求订阅api&#xff08;携带客户端id&#xff09;&#xff0c;与服务器建立SSE链接&#xff1b;后续服务器需要推送消息到客户端时&#xff0c;再根据客户端id从已建立链接的会话中找到目标客户端&#xff0c;将消息推送出去。…

【阻塞队列】- ArrayBlockingQueue 的原理-迭代器

文章目录 1. 前言2. 迭代器3. Itrs3.1 参数3.2 迭代器 Itr3.2.1 参数3.2.2 构造器3.2.3 hasNext3.2.4 next3.2.5 remove3.2.6 shutdown3.2.7 removedAt3.2.8 takeIndexWrapped 3.3 doSomeSweeping&#xff08;tryHandler&#xff09;3.4 register3.5 takeIndexWrapped3.6 remov…

人工智能与传统编程的主要区别是什么?

传统编程&#xff1a;开发者预先编写软件行为规则&#xff0c;代码基于程序员定义逻辑处理输入并产生确定输出&#xff0c;具有确定性、手动编写规则和结构化逻辑特点&#xff0c;如垃圾邮件分类程序基于预设关键词等规则。AI 编程&#xff1a;从数据中学习而非手动编写规则&am…

SpringBoot使用TraceId日志链路追踪

项目场景&#xff1a; ??有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。为了解决这个痛点&#xff0c;就使用了TraceId&#xff0c;根据TraceId关键字进入服务…

ts总结一下

ts基础应用 /*** 泛型工具类型*/ interface IProps {id: string;title: string;children: number[]; } type omita Omit<IProps, id | title>; const omitaA: omita {children: [1] }; type picka Pick<IProps, id | title>; const pickaA: picka {id: ,title…

八大排序——直接插入排序

直接插入排序&#xff08;Straight Insertion Sort&#xff09;&#xff0c;通常简称为插入排序&#xff0c;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。本文…

【QGIS入门实战精品教程】7.3:QGIS制作千层饼(DEM+等高线+影像+TIN)

文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 添加图层3. 制作千层饼一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的7.3.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软件 打开QGIS软件。 QGIS软件主界面。

NetSuite Formula(HTML)超链打开Transaction

当Saved Search作为Sublist应用在Form时&#xff0c;如果Document Number是Group过的&#xff0c;则会出现如下超链失效的情况。 解决办法&#xff1a; 可以利用Saved Search中的Formula&#xff08;HTML&#xff09;功能来构建超链&#xff0c;用于打开Transaction。 以下图…