`
lovnet
  • 浏览: 6670324 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

如何使用Valgrind

 
阅读更多


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 通常并不重要

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics