记录安装使用Valgrind的方法
一、安装 Valgrind
安装代码:
| 1 2 3 4 5 6 | wget https://sourceware.org/pub/valgrind/valgrind-3.22.0.tar.bz2 tar -xjvf valgrind-3.22.0.tar.bz2 cd valgrind-3.22.0 ./configure make sudo make install | 
版本验证:
| 1 | valgrind --version | 
这里我因为安装过 devtoolset-10 所以他会自带 gcc、gdb、perftools、valgrind 等…
二、简单使用
| 1 | valgrind --leak-check=full ./your_program | 
进程执行完毕后会输出一些内容
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ==19415== LEAK SUMMARY: ==19415==    definitely lost: 4,192,383 bytes in 10,010 blocks ==19415==    indirectly lost: 6,324,934 bytes in 41,053 blocks ==19415==      possibly lost: 11,199 bytes in 45 blocks ==19415==    still reachable: 102,212 bytes in 2,526 blocks ==19415==                       of which reachable via heuristic: ==19415==                         stdstring          : 15,245 bytes in 339 blocks ==19415==                         newarray           : 3,944 bytes in 16 blocks ==19415==                         multipleinheritance: 160 bytes in 1 blocks ==19415==         suppressed: 0 bytes in 0 blocks ==19415== Reachable blocks (those to which a pointer was found) are not shown. ==19415== To see them, rerun with: --leak-check=full --show-leak-kinds=all ==19415==  ==19415== Use --track-origins=yes to see where uninitialised values come from ==19415== For lists of detected and suppressed errors, rerun with: -s ==19415== ERROR SUMMARY: 36 errors from 36 contexts (suppressed: 0 from 0) | 
明确泄漏(definitely lost):内存还没释放,但已经没有指针指向内存,内存已经不可访问
间接泄漏(indirectly lost):泄漏的内存指针保存在明确泄漏的内存中,随着明确泄漏的内存不可访问,导致间接泄漏的内存也不可访问
可能泄漏(possibly lost):指针并不指向内存头地址,而是指向内存内部的位置
仍可访达(still reachable):指针一直存在且指向内存头部,直至程序退出时内存还没释放。
三、进阶教程
使用Massif内存堆栈分析
| 1 | valgrind --tool=massif --massif-out-file=massif.out ./your_program | 
–massif-out-file 可以设置结果输出到指定文件。
可以使用ms_print工具来查看 massif.out.* 文件的内容。
使用 Callgrind 进行内存分析
虽然 Callgrind 主要用于性能分析,但它也可以显示每个函数的内存使用情况。可以使用 Callgrind 来看哪个函数分配了最多的内存。
| 1 | valgrind --tool=callgrind ./your_program | 
然后你可以使用 kcachegrind 或其他 Callgrind 数据查看器来查看结果。
比如这里使用 callgrind_annotate 工具:
| 1 | callgrind_annotate callgrind.out.[pid] > callgrind.result | 
四、其他注意事项
应该使用kill的默认参数发送TERM 信号
kill 命令发送信号到指定的进程 ID。例如,kill 12345 会发送 TERM 信号到进程 ID 为 12345 的进程。
【C++】Valgrind 内存泄漏检测工具
				
					