ubuntu进行C++的调试

news2025/1/5 7:13:39

方法一: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.coloradmin.cn/o/2269929.html

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

相关文章

TTL 传输中过期问题定位

问题&#xff1a; 工作环境中有一个acap的环境&#xff0c;ac的wan口ip是192.168.186.195/24&#xff0c;ac上lan上有vlan205&#xff0c;其ip子接口地址192.168.205.1/24&#xff0c;ac采用非nat模式&#xff0c;而是路由模式&#xff0c;在上级路由器上有192.168.205.0/24指向…

Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配

这两天维护的一个项目&#xff0c;使用arm64-v8a指令集编译时遇到了报错&#xff0c;提示类型不匹配&#xff0c;具体报错的代码【脚本根据C源文件生成的中间文件】如下&#xff1a; const google::protobuf::RepeatedField<unsigned long long>& ret cobj->equi…

连接Milvus

连接到Milvus 验证Milvus服务器正在侦听哪个本地端口。将容器名称替换为您自己的名称。 docker port milvus-standalone 19530/tcp docker port milvus-standalone 2379/tcp docker port milvus-standalone 192.168.1.242:9091/api/v1/health 使用浏览器访问连接地址htt…

走方格(蓝桥杯2020年试题H)

【问题描述】在平面上有一些二维点阵。这些点的编号就像二维数组的编号一样&#xff0c;从上到下依次为第1~n行&#xff0c;从左到右依次为第1~m列&#xff0c;每个点可以用行号和列号表示。 现在有个人站在第1行第1列&#xff0c;他要走到第n行第m列&#xff0c;只能向右或者向…

28. 二叉树遍历

题目描述 根据给定的二叉树结构描述字符串&#xff0c;输出该二叉树按照中序遍历结果字符串。中序遍历顺序为:左子树&#xff0c;根结点&#xff0c;右子树。 输入描述 由大小写字母、左右大括号、逗号组成的字符串: 1、字母代表一个节点值&#xff0c;左右括号内包含该节点的子…

Swift White Hawkstrider

Swift White Hawkstrider 迅捷白色陆行鸟 Swift White Hawkstrider - Item - 魔兽世界怀旧服TBC数据库_WOW2.43数据库_70级《燃烧的远征》数据库 Kaelthas Sunstrider (1) <Lord of the Blood Elves> 凯尔萨斯逐日者. 掉落 [80圣骑士][Alonsus-加丁][诺森德冒险补给品…

LeetCode算法题——有序数组的平方

题目描述 给你一个按非递减顺序排序的整数数组nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求也按非递减顺序排序。 题解 解法一&#xff1a;暴力解法 思路&#xff1a; 该题目可通过暴力解法解决&#xff0c;即利用for循环遍历数组&#xff0c;对数组每…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(四)

文章目录 一、管理员角色功能实现1、添加教师功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、教师管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下…

DVWA靶场Brute Force (暴力破解) 漏洞low(低),medium(中等),high(高),impossible(不可能的)所有级别通关教程

目录 暴力破解low方法1方法2 mediumhighimpossible 暴力破解 暴力破解是一种尝试通过穷尽所有可能的选项来获取密码、密钥或其他安全凭证的攻击方法。它是一种简单但通常无效率的破解技术&#xff0c;适用于密码强度较弱的环境或当攻击者没有其他信息可供利用时。暴力破解的基…

基于feapder爬虫与flask前后端框架的天气数据可视化大屏

# 最近又到期末了&#xff0c;有需要的同学可以借鉴。 一、feapder爬虫 feapder是国产开发的新型爬虫框架&#xff0c;具有轻量且数据库操作方便、异常提醒等优秀特性。本次设计看来利用feapder进行爬虫操作&#xff0c;可以加快爬虫的速率&#xff0c;并且简化数据入库等操作…

抖音短视频矩阵系统源码开发技术解析

开发概览&#xff1a; 抖音短视频矩阵系统的构建基于一系列现代技术栈&#xff0c;主要包括VUE, Spring Boot和Django。本文档旨在为开发者提供关于短视频矩阵系统源代码的开发与部署指南。 技术框架分析&#xff1a; 前端技术选型&#xff1a; 对于前端界面的构建&#xf…

CentOS Stream 9 安装 JDK

安装前检查 java --version注&#xff1a;此时说明已安装过JDK&#xff0c;否则为未安装。如若已安装过JDK可以跳过安装步骤直接使用&#xff0c;或者先卸载已安装的JDK版本重新安装。 安装JDK 官网下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads…

【git】git生成rsa公钥的方法

git生成rsa公钥的方法 一&#xff0c;简介二&#xff0c;操作方法三&#xff0c;总结 一&#xff0c;简介 在工作的过程中&#xff0c;经常需要生成rsa的密钥&#xff0c;然后提供给别人&#xff0c;然后别人给你开通代码下载权限。本文介绍如何在本地生成rsa的密钥供参考。 …

Solon 加入 GitCode:助力国产 Java 应用开发新飞跃

在当今数字化快速发展的时代&#xff0c;Java 应用开发框架不断演进&#xff0c;开发者们始终在寻找更快、更小、更简单的解决方案。近期&#xff0c;Solon 正式加入 GitCode&#xff0c;为广大 Java 开发者带来全新的开发体验&#xff0c;尤其是在国产应用开发进程中&#xff…

如何通过深度学习提升大分辨率图像预测准确率?

随着科技的不断进步&#xff0c;图像处理在各个领域的应用日益广泛&#xff0c;特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中&#xff0c;大分辨率图像的使用已经成为了一项不可或缺的技术。然而&#xff0c;大分辨率图像带来了巨大的计算和存储压力&#xff0c;同…

硬件基础知识笔记(2)——二级管、三极管、MOS管

Part 2 二级管、三极管、MOS管 1、二级管1.1肖特基二极管和硅二极管选型比较1.2到底是什么决定了二极管的最高工作频率&#xff1f;1.3二极管结电容和反向恢复时间都是怎么来的1.4肖特基二极管的工作原理1.5为什么要用肖特基二极管续流&#xff1f; 2、三极管2.1三极管工作原理…

操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个

Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个关键性规范的零星任务的可调度性分析 目录 一、论文核心思想 二、基本定义 2.1 关键性指标 2.2 任务及相关参数定义 2.3 几个基础定义 三、可调度性分析 3.1 调度算法分…

word中文献引用[]符号的上下标格式修改

word中文献引用[]符号的上下标格式修改 百度网址 1、查找打开使用通配符&#xff0c;输入[[][0-9]{1,2}[]]&#xff0c;即可匹配所有的字[1],[12]这些字符&#xff0c;然后鼠标点击替换为的空白处&#xff0c;再点击特殊格式–>“字体”&#xff0c;选中上标&#xff0c;最…

在 ArcGIS Pro/GeoScene Pro 中设计专题地图的符号系统

原始 按颜色对面进行符号化 打开符号系统 选择主符号系统 选择字段及其计算方式 更改临界值</

_使用CLion的Vcpkg安装SDL2,添加至CMakelists时报错,编译报错

语言&#xff1a;C20 编译器&#xff1a;gcc 14.2 摘要&#xff1a;初次使用Vcpkg添加SDL2&#xff0c;出现CMakelists找不到错误、编译缺失main错误、运行失败错误。 CMakelists缺失错误&#xff1a; 使用CLion的Vcpkg安装SDL2时&#xff0c;按照指示把对应代码添加至CMakel…