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::Mat从vector<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++ 代码的设置。下面是对各个字段的解释:
-
version: 该字段指定了配置文件的版本。在这里是 “0.2.0”,表示使用的配置格式版本。
-
configurations: 这是一个数组,包含了一个或多个调试配置。在这个例子中,只有一个配置。
-
name: 该字段是配置的名称,显示在调试配置下拉菜单中。在这里是 “(gdb) Launch”,表示使用 GDB 调试器进行调试。
-
type: 指定调试器的类型。在这里是 “cppdbg”,表示使用 C++ 调试器。
-
request: 指定调试请求的类型。在这里是 “launch”,表示启动一个新的调试会话。
-
program: 这是要调试的程序的路径。在这里需要填写程序的实际路径,例如
${workspaceFolder}/src/test,其中${workspaceFolder}是当前工作区的根目录。 -
args: 这是传递给程序的命令行参数。当前为空数组,表示没有参数。
-
stopAtEntry: 该字段指定调试器是否在程序入口处停止。设置为
false表示不在入口处停止。 -
cwd: 该字段指定调试时的当前工作目录。在这里使用
${fileDirname},表示当前文件的目录。 -
environment: 这是一个数组,用于设置环境变量。当前为空数组,表示没有额外的环境变量。
-
externalConsole: 该字段指定是否使用外部控制台来运行程序。设置为
false表示使用内置终端。 -
MIMode: 指定调试器的模式。在这里是 “gdb”,表示使用 GDB 调试器。
-
setupCommands: 这是一个数组,包含在调试会话开始时要执行的命令。这里有两个命令:
- 第一个命令启用 GDB 的美化打印功能,便于查看复杂数据结构。
- 第二个命令设置反汇编的风格为 Intel 格式。
-
ignoreFailures: 该字段指定如果设置命令失败,是否忽略错误。在这里设置为
true,表示即使命令失败也不会中断调试会话。
总的来说,这个配置文件定义了如何在 VSCode 中使用 GDB 调试 C++ 程序的详细设置。
相关文章:
ubuntu进行C++的调试
方法一:gdb调试 作用: GDB 是 GNU 调试器,用于调试 C/C 程序。它可以在命令行中使用,提供强大的调试功能。 集成: GDB 可以独立于 VSCode 使用,你可以在终端中直接运行 GDB 来调试程序。 使用示例:编译程序时使用 -g 选项以包含调…...
【U8+】用友U8软件中,出入库流水输出excel的时候提示报表输出引擎错误。
【问题现象】 通过天联高级版客户端登录拥有U8后, 将出入库流水输出excel的时候,提示报表输出引擎错误。 进行报表输出时出现错误,错误信息:找不到“fd6eea8b-fb40-4ce4-8ab4-cddbd9462981.htm”。 如果您正试图从最近使用的文件列…...
NoSQL简介
NoSQL 的定义及特点 NoSQL(Not Only SQL)是一种非关系型数据库,设计之初为解决关系型数据库在扩展性、性能和多样化数据处理方面的局限性。NoSQL 支持多种数据模型,包括键值对、文档、列族和图形结构,广泛应用于大规模…...
XIAO Esp32 S3 网络摄像头——3音视频监控
1、介绍 之前分别介绍了音频和视频的接收,本文是整合了前2篇文章,实现了音视频的同时获取。 效果: 用xiao esp35 s3自制一个网络摄像头 2、适用场景广泛 家庭安防 无论是门前监控,还是室内安全,自制摄像头可以让你轻松把握每个角落,实时查看视频流,防止任何潜在风险。…...
题目解析与代码实现:You‘re Given a String
引言 本文将详细解读一道字符串处理题目 “You’re Given a String”,并用 Python 实现该题的解决方案,同时解析其核心算法逻辑。本文适合有一定基础的程序员,希望通过字符串算法提升能力的读者。 1. 题目描述 问题背景 题目给出了一个字符…...
Understanding the Lomb–Scargle Periodogram
本文目的:了解Lomb–Scargle Periodogram的原理 (用来估算不均匀采样数据的周期)参考文献Understanding the Lomb–Scargle Periodogram思路: 连续傅里叶变换 --> 离散傅里叶变换(均匀采样–> Classifical perio…...
解决Linux切换用户后的命令提示符为-bashxx$的问题
1、问题描述 切换用户时,命令提示符为-bashxx$ 比如: [rootlocalhost ~]# su zhouxingchi bash-4.2$ ### 显示看着不正常的命令提示符 2、PS1变量 PS1变量就是我们的命令提示符的内容,当我们登录时会加载该变量,从而显示提…...
AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)
AMP 混合精度训练中的动态缩放机制 在深度学习中,混合精度训练(AMP, Automatic Mixed Precision)是一种常用的技术,它利用半精度浮点(FP16)计算来加速训练,同时使用单精度浮点(FP32…...
Oracle数据库如何找到 Top Hard Parsing SQL 语句?
有一个数据库应用程序存在过多的解析问题,因此需要找到产生大量硬解析的主要语句。 什么是硬解析 Oracle数据库中的硬解析(Hard Parse)是指在执行SQL语句时,数据库需要重新解析该SQL语句,并创建新的执行计划的过程。这…...
Mono里运行C#脚本25—mono_codegen
前面分析怎么样找到主函数Main的入口点功能,也就是说已经找到了这个函数的CIL代码。虽然找到了代码,但是还不能执行它的,因为它是一种虚拟机的代码。也就是说它是假的代码,不是现实世界存在的机器的代码,因此不能直接执行,必须经过后端编译器的再次编译才能真正运行它。下…...
flink cdc oceanbase(binlog模式)
接上文:一文说清flink从编码到部署上线 环境:①操作系统:阿里龙蜥 7.9(平替CentOS7.9);②CPU:x86;③用户:root。 预研初衷:现在很多项目有国产化的要求&#…...
【WPF】 数据绑定机制之INotifyPropertyChanged
INotifyPropertyChanged 是 WPF 中的一个接口,用于实现 数据绑定 中的 属性更改通知。它的主要作用是,当对象的某个属性值发生更改时,通知绑定到该属性的 UI 控件更新其显示内容。 以下是有关 INotifyPropertyChanged 的详细信息和实现方法&…...
机器学习算法深度解析:以支持向量机(SVM)为例及实战应用
机器学习算法深度解析:以支持向量机(SVM)为例及实战应用 在当今数据驱动的时代,机器学习作为人工智能的一个核心分支,正以前所未有的速度改变着我们的生活与工作方式。从金融风控到医疗诊断,从自动驾驶到智…...
网络编程基础:连接Java的秘密网络
1 网络编程的重要性 网络编程允许Java应用程序与其他计算机或设备进行通信。这包括从简单的数据传输到复杂的分布式系统和Web服务。 2 Java网络编程的核心类 Java提供了多个类来支持网络编程: InetAddress:表示网络上的IP地址。 URL:表示统…...
无监督学习:自编码器(AutoEncoder)
自编码器:数据的净化之旅 引言 自编码器作为一种强大的特征学习方法,已经经历了从简单到复杂的发展历程。本文综述了多种类型的自编码器及其演进过程,强调了它们在数据降维、图像处理、噪声去除及生成模型等方面的关键作用。随着技术的进步…...
在不到 5 分钟的时间内将威胁情报 PDF 添加为 AI 助手的自定义知识
作者:来自 Elastic jamesspi 安全运营团队通常会维护威胁情报报告的存储库,这些报告包含由报告提供商生成的大量知识。然而,挑战在于,这些报告的内容通常以 PDF 格式存在,使得在处理安全事件或调查时难以检索和引用相关…...
Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。 语法: prepend 命令的基本语法格式如下: prepend key flags exptime bytes [noreply] value参数说明如下: key:键值 key-value 结构中的 key&a…...
Win10 VScode配置远程Linux开发环境
Windows VScode配置远程Linux开发环境 记录一下在Windows下VScode配置远程连接Linux环境进行开发的过程。 VScode的远程编程与调试的插件Remote Development,使用这个插件可以在很多情况下代替vim直接远程修改与调试服务器上的代码,搭配上VScode的语言…...
微信小程序校园自助点餐系统实战:从设计到实现
随着移动互联网的发展,越来越多的校园场景开始智能化、自助化。微信小程序凭借其轻量化、便捷性和强大的生态支持,成为了各类校园应用的首选工具之一。今天,我们将通过实际开发一个微信小程序“校园自助点餐系统”来展示如何设计和实现这样一…...
解决sublime编译无法输入问题
在使用sublime编译简单的c语言的时候,发现编译过程中,带有scanf的程序,无法正确的输入。 需要提前配置好gcc 和g++ 一、新增配置 新建编译系统文件:C.sublime-build 具体步骤:菜单中选择Tools——Build System——New Build System——保存文件名C.sublime-build ,填写以…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
