1. 简介
Valgrind 套件提供了大量的调试和profile工具,帮助我们使自己的程序跑得更快、更准确。这些工具最流行的名字是Memchek。它可以检测到一些与内存相关的错误,这些错误在C或者C++中经常遇到,这些错误可能会导致一些灾难性的后果。
本文简要的讲述如何使用Memcheck进行内存检测。如果有兴趣可以继续看看Valgrind的用户手册。
2. 准备你自己程序
使用-g选项编译你的程序,这样会产生一些调试信息,使用这些信息Valgrind将会精确的查找到错误在源文件的哪一行中。当然也可以使用-O0(如果你可以忍受执行速度下降的话)。如果使用-O1的话,在“错误信息”中显示的行号可能不是很精确。不过一般来讲,使用-O1,Memcheck也会正常工作,并且它可以获得更高的速度。不推荐使用-O2.
3. 使用Memcheck运行你的程序
一般我们会这样运行我们的程序:
myprog arg1 arg2
使用下面的命令:
valgrind --leak-check=yes myprog arg1 arg2
默认的工具就是Memcheck ,--leak-check 选项打开了详细的内存泄漏检测器。
我们的程序可能比平时跑得要慢些,大约慢20-30倍。Memcheck将会给出一些关于内存错误和泄漏的信息。
4. Memcheck输出信息的解释
给出一个C程序,暂且称为a.c, 他又一个内存错误和一个内存泄漏。
#include <stdlib.h>
void f(void)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; // problem 1: heap block overrun
} // problem 2: memory leak -- x not freed
int main(void)
{
f();
return 0;
}
这样编译一下:
gcc -O0 -g a.c
然后这样执行:
valgrind --leak-check=full ./a.out
下面给出他的执行结果的部分内容,显示的是:problem 1: heap block overrun
==12425== Invalid write of size 4
==12425== at 0x400542: f (a.c:7)
==12425== by 0x400552: main (a.c:12)
==12425== Address 0x51ef068 is 0 bytes after a block of size 40 alloc'd
==12425== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12425== by 0x400535: f (a.c:6)
==12425== by 0x400552: main (a.c:12)
需要注意的是
- 在每个错误信息中有很多内容,一定要小心阅读。
- 12425是进程ID号,一般不重要
- 第一行讲的是错误的类型。
- code address 通常并不重要