C/C++内存诊断工具——Valgrind

官网

http://www.valgrind.org

 

下载与安装

#wget http://www.valgrind.org/downloads/valgrind-3.8.1.tar.bz2
#tar xvf valgrind-3.8.1.tar.bz2
#cd valgrind-3.8.1
#./configure --prefix=/usr/local/webserver/valgrind
#make
#make install

 

测试代码

[cpp] view plaincopy

  1. #include <stdlib.h>  

  2. int* func(void)  

  3. {  

  4.    int* x = malloc(10 * sizeof(int));  

  5.    x[10] = 0;  //问题1: 数组下标越界  

  6. }                    

  7.  int main(void)  

  8. {  

  9.    int* x=NULL;  

  10.    x=func();  

  11.    //free(x);    

  12.    x=NULL;  

  13.    return 0;   //问题2: 内存没有释放  

  14.  }  


编译

#gcc -g -o test test.c

 

内存检查
#valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test

 

报告:


C/C++内存诊断工具——Valgrind

 

说明

 Invalid write of size 4:表示数组越界写了4字节

40 bytes in 1 blocks:表示因程序退出而发生内存泄露40字节

 

修复bug,重新检查提示已经没有内存泄露

C/C++内存诊断工具——Valgrind

 

文档:

Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误:

  使用未初始化的内存 (Use of uninitialised memory)
  使用已经释放了的内存 (Reading/writing memory after it has been free’d)
  使用超过malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
  对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
  申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
  malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
  src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
  重复free

-----------------------------------------------------------------------------------------------------------------------------

用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind 工具

  1. -tool=<name> 最常用的选项。运行 valgrind 中名为toolname的工具。默认memcheck。

  2. h –help 显示帮助信息。

  3. -version 显示valgrind 内核的版本,每个工具都有各自的版本。

  4. q –quiet 安静地运行,只打印错误信息。

  5. v –verbose 更详细的信息, 增加错误数统计。

  6. -trace-children=no|yes 跟踪子线程? [no]

  7. -track-fds=no|yes 跟踪打开的文件描述?[no]

  8. -time-stamp=no|yes 增加时间戳到LOG信息? [no]

  9. -log-fd=<number> 输出LOG到描述符文件 [2=stderr]

  10. -log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID

  11. -log-file-exactly=<file> 输出LOG信息到 file

  12. -log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。 [none]

  13. -log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port

LOG信息输出

  1. -xml=yes 将信息以xml格式输出,只有memcheck可用

  2. -num-callers=<number> show <number> callers in stack traces [12]

  3. -error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]

  4. -error-exitcode=<number> 如果发现错误则返回错误代码 [0=disable]

  5. -db-attach=no|yes 当出现错误,valgrind 会自动启动调试器gdb。[no]

  6. -db-command=<command> 启动调试器的命令行选项[gdb -nw %f %p]

适用于Memcheck工具的相关选项:

  1. -leak-check=no|summary|full 要求对leak给出详细信息? [summary]

  2. -leak-resolution=low|med|high how much bt merging in leak check [low]

  3. -show-reachable=no|yes show reachable blocks in leak check? [no]


你可能感兴趣的:(C/C++内存诊断工具——Valgrind)