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

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.lryc.cn/news/516000.html

相关文章:

  • 【U8+】用友U8软件中,出入库流水输出excel的时候提示报表输出引擎错误。
  • NoSQL简介
  • XIAO Esp32 S3 网络摄像头——3音视频监控
  • 题目解析与代码实现:You‘re Given a String
  • Understanding the Lomb–Scargle Periodogram
  • 解决Linux切换用户后的命令提示符为-bashxx$的问题
  • AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)
  • Oracle数据库如何找到 Top Hard Parsing SQL 语句?
  • Mono里运行C#脚本25—mono_codegen
  • flink cdc oceanbase(binlog模式)
  • 【WPF】 数据绑定机制之INotifyPropertyChanged
  • 机器学习算法深度解析:以支持向量机(SVM)为例及实战应用
  • 网络编程基础:连接Java的秘密网络
  • 无监督学习:自编码器(AutoEncoder)
  • 在不到 5 分钟的时间内将威胁情报 PDF 添加为 AI 助手的自定义知识
  • Memcached prepend 命令
  • Win10 VScode配置远程Linux开发环境
  • 微信小程序校园自助点餐系统实战:从设计到实现
  • 解决sublime编译无法输入问题
  • const修饰指针总结
  • uniapp实现后端数据i18n国际化
  • 什么是国密设计
  • Android IO 问题:java.io.IOException Operation not permitted
  • 安装bert_embedding遇到问题
  • cka考试-03-k8s版本升级
  • 【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • Spring Boot 的自动配置,以rabbitmq为例,请详细说明
  • Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)
  • LeetCode - 初级算法 数组(旋转数组)
  • logback日志框架源码分析