
新手使用 Valgrind只需要记住最核心的 3 步非常简单。假设你写了一个代码叫main.cpp下面是完整流程。1. 第 1 步安装如果在 Linux 下比如 Ubuntu先装上它sudo apt-get install valgrind2. 第 2 步加-g编译你的代码平时你怎么编译就怎么编译唯一的区别是必须加上-g参数。加了-gValgrind 才能告诉你具体是哪一行代码出了问题。g -g main.cpp -o app注意如果你用的是 CMake确保你的编译类型是 Debug比如set(CMAKE_BUILD_TYPE Debug)它会自动带上-g3. 第 3 步用 Valgrind 启动你的程序平时你运行程序是这样./app现在把valgrind放在最前面像这样运行valgrind --leak-checkfull ./app如果你程序需要传参数就跟在后面比如valgrind --leak-checkfull ./app 参1 参24. 第 4 步看懂输出结果程序运行结束后终端会打印一堆带有数字的信息。你只要往下翻重点看最后面的LEAK SUMMARY泄漏总结情况 A完美没问题如果看到类似这样All heap blocks were freed -- no leaks are possible恭喜没有任何内存泄漏情况 B有内存泄漏如果看到类似这样LEAK SUMMARY: definitely lost: 40 bytes in 1 blocks说明泄漏了这时候你往上翻报错信息Valgrind 会明确告诉你哪一行出错了比如12345 by 0x401156: main (main.cpp:15)这就告诉你main.cpp的第 15 行分配的内存忘记释放了。去检查那一行代码加个delete或者free就行了。总结新手用 Valgrind就是加-g编译然后valgrind --leak-checkfull ./程序最后看报错里的文件名和行号去改 bug。就这么简单。如果项目调用了第3方库加上下面 3 个技巧足够应对大部分情况了技巧 1把日志保存到文件极其重要如果你的项目很大报错可能非常多终端屏幕根本刷不下。你需要把 Valgrind 的输出存到文件里慢慢看。实战用法加上--log-filevalgrind --leak-checkfull --log-filevalgrind_report.txt ./app跑完之后你只需要打开valgrind_report.txt慢慢搜索分析就行了。技巧 2在第三方库的报错海中找自己的 BugOpenCV 为例像 OpenCV、FFmpeg 这种库底层为了性能往往会有一些单例模式或全局缓存不释放Valgrind 会认为这也是内存泄漏报出一大堆错误。怎么办不用害怕也不用去改 OpenCV 的源码。看报错日志时只找那些调用栈里有你自己写的代码的报错。比如报错栈里全是libopencv_core.so直接跳过如果某一行出现了main.cpp:80这就说明是你调用不当或者你忘记释放了重点盯住这块。技巧 3揪出未初始化的随机值引发的诡异 BugC 里最头疼的 Bug 之一就是你声明了一个变量int a;但没给初始值导致程序每次运行结果都不一样甚至偶尔崩溃。Valgrind 如果报出类似这种错误Conditional jump or move depends on uninitialised value(s)这就说明你用了没初始化的变量。实战用法加上--track-originsyes参数。valgrind --leak-checkfull --track-originsyes --log-filevalgrind_report.txt ./app加了这个参数Valgrind 会像开了天眼一样精确告诉你这个没初始化的垃圾值是在哪个文件的哪一行被创建出来的帮你一秒定位总结对于个人项目真正够用且好用的排错命令是这句valgrind --leak-checkfull --track-originsyes --log-fileval_log.txt ./app遇到 Bug 时跑这句命令然后打开val_log.txt搜索你的源文件名字比如main.cpp问题基本就迎刃而解了