一、工具使用要点
Valgrind提供了一系列工具,其中最常用的是Memcheck,它可以检测内存相关的问题,比如使用未初始化的内存、内存访问越界以及内存泄漏等问题。其他工具如Cachegrind和Callgrind则分别用于缓存和函数调用分析。
Valgrind还提供了分析程序性能的工具,如Cachegrind可以分析程序的缓存使用情况,帮助优化程序以提高运行效率。
Valgrind会显著降低程序的运行速度,因此在性能测试中不应使用Valgrind。
二、valgrind安装
ubuntu中:
sudo apt-get install valgrind
CentOS中:
sudo yum install valgrind
如果想要源码编译:
下载:
wget https://sourceware.org/pub/valgrind/valgrind-3.16.1.tar.bz2
解压缩:
tar -jxvf valgrind-3.16.1.tar.bz2
打开工作目录:
cd valgrind-3.16.1
配置:
./configure
编译:
make
安装:
sudo make install
检查版本:
valgrind --version
三、如何使用:
检测你的程序:
valgrind --leak-check=yes ./your_program
之后,Valgrind 会在程序结束后报告内存泄漏的位置和相关信息。
其中常用的命令选项:
--tool=<name>
:指定要使用的工具,默认为Memcheck。例如,--tool=cachegrind
将启动Cachegrind工具。--leak-check=full
:进行全面的内存泄漏检查。这在查找程序中的内存泄漏问题时特别有用。--log-file=<file>
:将输出信息写入指定的文件中。这对于长时间运行的分析或将结果保存以后续处理很有用。
四、例子:
==12345== HEAP SUMMARY:
==12345== in use at exit: 72,704 bytes in 1 blocks
==12345== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==12345==
==12345== 72,704 bytes in 1 blocks are definitely lost in loss record 1 of 1
==12345== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12345== by 0x1086BBF: main (in /path/to/your_program)
==12345==
==12345== LEAK SUMMARY:
==12345== definitely lost: 72,704 bytes in 1 blocks
==12345== indirectly lost: 0 bytes in 0 blocks
==12345== possibly lost: 0 bytes in 0 blocks
==12345== still reachable: 0 bytes in 0 blocks
==12345== suppressed: 0 bytes in 0 blocks
从报告中,我们可以得知程序在退出时有 72,704 字节的内存泄漏,共分配了 1 次,但没有释放。同时,报告还显示了内存分配的位置和调用栈信息,有助于我们定位问题所在。