记录安装使用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 内存泄漏检测工具