Linux 内存调试工具- Valgrind 使用初探

Valgrind 是在linux系统下开发应用程序时用于调试内存问题的工具。它尤其擅长发现内存管理的问题,它可以检查程序运行时的内存泄漏问题。

它的官方网址是 http://www.valgrind.org/

下载最新版本的Valgrind,目前是3.2.0。 wget http://www.valgrind.org/downloads/valkyrie-1.2.0.tar.bz2

执行常规的安装步骤:./confgure && make && make install。注意: 系统必须安装QT的开发包。即便这样在make 时还是出现qplatformdefs.h这个文件找不到的情况,导致make失败。查找系统中的qplatformdefs.h 之后,发现没有存在于qt的标准头文件目录/usr/lib/qt-3.3/include。如是将/usr/lib/qt-3.3/mkspecs /linux-g++/ 目录下该头文件复制标准头文件目录,重新make ,后面一切OK。

初次使用
    编译如下代码:  gcc -Wall example.c -g -o example 

 

  
  
  
  
  1. #include <stdlib.h>void f(void){   
  2.   int* x = malloc(10 * sizeof(int));    
  3.  x[10] = 0;    
  4.       // problem 1: heap block overrun}     
  5.                  // problem 2: memory leak -- x not freedint main(void){   
  6.     f();  
  7.      return 0;} 

注意:gcc 的-g 选项让Valgrind调试输出时指出相应信息的代码所在的行号。

 

  
  
  
  
  1. valgrind --tool=memcheck --leak-check=yes ./example 

 

  
  
  
  
  1. ==6742== Memcheck, a memory error detector for x86-linux. 
  2. ==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al. 
  3. ==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux. 
  4. ==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al. 
  5. ==6742== For more details, rerun with: -v 
  6. ==6742==   
  7. ==6742== Invalid write of size 4 
  8. ==6742==    at 0x8048384: f (example.c:6)  
  9. ==6742==    by 0x80483AC: main (example.c:12)  
  10. ==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd 
  11. ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)  
  12. ==6742==    by 0x8048377: f (example.c:5)  
  13. ==6742==    by 0x80483AC: main (example.c:12)  
  14. ==6742==   
  15. ==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)  
  16. ==6742== malloc/free: in use at exit: 40 bytes in 1 blocks. 
  17. ==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated. 
  18. ==6742== For counts of detected errors, rerun with: -v 
  19. ==6742== searching for pointers to 1 not-freed blocks. 
  20. ==6742== checked 1360800 bytes. 
  21. ==6742==   
  22. ==6742==   
  23. ==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 
  24. ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)  
  25. ==6742==    by 0x8048377: f (example.c:5)  
  26. ==6742==    by 0x80483AC: main (example.c:12)  
  27. ==6742==   
  28. ==6742== LEAK SUMMARY: 
  29. ==6742==    definitely lost: 40 bytes in 1 blocks. 
  30. ==6742==    possibly lost:   0 bytes in 0 blocks. 
  31. ==6742==    still reachable: 0 bytes in 0 blocks. 
  32. ==6742==         suppressed: 0 bytes in 0 blocks. 
  33. ==6742== Reachable blocks (those to which a pointer was found) are not shown. 
  34. ==6742== To see them, rerun with: --show-reachable=yes 

 上面的C程序存在两个错误:1. 数组下标越界;2. 分配的内存没有释放,存在内存泄露的问题。对于错误1,看Valgrind的调试信息片断

 

  
  
  
  
  1. ==6742== Invalid write of size 4 
  2. ==6742==    at 0x8048384: f (example.c:6)  
  3. ==6742==    by 0x80483AC: main (example.c:12)  
  4. ==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd 
  5. ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)  
  6. ==6742==    by 0x8048377: f (example.c:5) 

对于错误2,看这个

  
  
  
  
  1. ==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.  
  2.  
  3. ...... 
  4.  
  5. ==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 
  6. ==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)  
  7. ==6742==    by 0x8048377: f (example.c:5)  
  8. ==6742==    by 0x80483AC: main (example.c:12)  

相关链接:

http://www.valgrind.org/docs/manual/quick-start.html

http://www-128.ibm.com/developerworks/cn/linux/l-pow-debug/

你可能感兴趣的:(linux,valgrind,内存调试工具,使用初探)