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

Valgrind 内存调试

一、Valgrind 是什么
Valgrind 是 Linux 下的开源内存调试 / 性能分析工具集,核心功能是检测程序的内存问题(泄漏、越界、重复释放、使用未初始化内存等),是 C/C++ 程序(尤其是涉及手动内存管理的程序,如你的 3D-3D 位姿估计代码)调试的必备工具。
它的核心原理是:通过模拟 CPU 执行程序,监控每一次内存申请 / 释放操作,精准定位内存违规行为,而非简单依赖操作系统的内存管理机制。
Valgrind 中最常用的组件是 memcheck(内存检查),也是我们检测内存泄漏的核心工具。
二、Valgrind 基本使用步骤

  1. 前提条件
    仅支持 Linux 系统(Windows/macOS 需借助 WSL / 虚拟机);
    编译程序时必须添加 -g 选项(保留调试信息,否则 Valgrind 只能显示内存地址,无法定位到具体代码行);
    建议关闭编译器优化(-O0),避免优化导致代码行号错位。
  2. 编译程序(添加调试选项)
    修改你的 CMakeLists.txt,确保编译时包含调试信息:
    # 替换原有的编译选项,添加 -g -O0 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -march=native -fPIC")
    重新编译生成可执行文件(如 pose_estimation_3d3d)。
  3. 运行 Valgrind 检测内存泄漏
    在终端执行以下命令(核心是 valgrind --leak-check=full ./可执行文件 参数):
    针对你的程序,完整命令如下:
    valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./pose_estimation_3d3d 1.png 2.png 1_depth.png 2_depth.png
    关键参数解释
    image
    三、Valgrind 输出结果解读(核心关注 2 部分)
  4. 内存错误(如越界、使用未初始化内存)
    如果代码中有内存越界(比如深度图坐标访问超出范围)、使用未初始化变量等问题,Valgrind 会直接定位到具体代码行:
点击查看代码
==12345== Invalid read of size 2
==12345==    at 0x402ABC: main (pose_estimation_3d3d.cpp:156)  // 错误代码行
==12345==  Address 0x5a123450 is 10 bytes after a block of size 100 alloc'd
==12345==    at 0x4C2B0F0: malloc (vg_replace_malloc.c:307)
==12345==    by 0x401234: cv::Mat::allocate(int) (mat.cpp:1234)
Invalid read of size 2:读取了 2 字节的无效内存(比如深度图ushort类型越界); 0x402ABC: main (pose_estimation_3d3d.cpp:156):直接指向你的代码第 156 行。 2. 内存泄漏汇总(核心关注) 程序运行结束后,Valgrind 会输出泄漏统计,关键分类:
点击查看代码
==12345== LEAK SUMMARY:
==12345==    definitely lost: 1,200 bytes in 15 blocks  // 确定泄漏(必须修复)
==12345==    indirectly lost: 480 bytes in 6 blocks    // 间接泄漏(由确定泄漏导致)
==12345==      possibly lost: 0 bytes in 0 blocks      // 可能泄漏(可忽略)
==12345==    still reachable: 0 bytes in 0 blocks      // 仍可访问(程序结束前未释放,但无危害)
==12345==         suppressed: 0 bytes in 0 blocks      // 系统库泄漏(忽略)
definitely lost:必须修复,对应代码中new后未delete的内存(如你的 g2o 顶点 / 边未释放); still reachable:无需修复(比如程序结束前未释放,但指针仍有效,操作系统会回收); possibly lost:一般可忽略(Valgrind 无法 100% 确认)。 如果你的代码修复了 g2o 内存释放问题,definitely lost 应该显示为 0 bytes。
http://www.jsqmd.com/news/177917/

相关文章:

  • 如何成为一名渗透测试专家:核心技能与职业路径
  • 开源项目分享 : Gitee热榜项目 2026-1-1 日榜
  • MySQL 中快速的复制一张表包括表结构和数据
  • 8.1 模块与包
  • 8.3 类的详解
  • 比360还好用,完全免费无套路!
  • Rust - 链式调用解引用的四种方式
  • 2024年SEVC SCI2区,双种群协同遗传算法+AGV柔性作业车间调度,深度解析+性能实测
  • 8款AI论文写作辅助工具对比:智能降重与高效创作效果评测
  • 手机变电脑摄像头!DroidCamX全平台使用指南与实战教程 - 教程
  • 【如何实现有效社交】转载
  • 数据目录在大数据架构中的核心作用解析
  • 轴向磁场轮毂电机的结构设计 电动汽车已经逐渐使用轮毂电机来代替发动机,这可以很好的减少油耗及尾...
  • 如何让你的语音助手有眼力见——Turn Detection 的 5 种解法丨Voice Agent 学习笔记
  • 深度测评9个AI论文工具,专科生轻松搞定毕业论文!
  • 亲测好用8个AI论文软件,专科生毕业论文轻松搞定!
  • 从理论到界面:六维坐标系与三值九层立体结构的工具化路径
  • 德诺超声波焊接机怎么选购才保证品质与性价比?
  • PotPlayer采集卡选麦克风会导致黑屏及音频修复方案
  • 人工智能辅助识别价值陷阱
  • 前沿技术!AI 应用架构师在 AI 安全漏洞检测系统的新突破
  • 三种主流接收机架构(超外差、零中频、射频直采)对比及发展趋势浅析
  • AI智能体在识别经济护城河中的作用
  • 高效创作与智能降重:8款AI论文写作工具功能评测
  • 8款AI论文辅助工具测评:智能降重与高效创作能力对比
  • 集体好奇心在教育领域的应用
  • 大小不足1M,干翻Windows!
  • springboot基于 Web的图书借阅管理信息系统
  • Jenkins流水线配置的两种方式
  • 高效创作与智能降重功能:8款AI论文写作工具测评分析