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
我们的程序可能比平时跑得要慢些,大约慢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
==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)
需要注意的是