valgrind 使用

1. 下载地址
http://valgrind.org,下载最新版本,3.7.0
2. 安装步骤
解压
./configure --prefix=/usr/local/

make;make install

3. 使用
--tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
--h –help 显示帮助信息。
-version 显示valgrind内核的版本,每个工具都有各自的版本。
q –quiet 安静地运行,只打印错误信息。
v –verbose 更详细的信息, 增加错误数统计。
-trace-children=no|yes 跟踪子线程? [no]
-track-fds=no|yes 跟踪打开的文件描述?[no]
-time-stamp=no|yes 增加时间戳到LOG信息? [no]
-log-fd=<number> 输出LOG到描述符文件 [2=stderr]
-log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
-log-file-exactly=<file> 输出LOG信息到 file
-log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。 [none]
-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port
LOG信息输出
-xml=yes 将信息以xml格式输出,只有memcheck可用
-num-callers=<number> show <number> callers in stack traces [12]
-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
-error-exitcode=<number> 如果发现错误则返回错误代码 [0=disable]
-db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
-db-command=<command> 启动调试器的命令行选项[gdb -nw %f %p]
适用于Memcheck工具的相关选项:
-leak-check=no|summary|full 要求对leak给出详细信息? [summary]
-leak-resolution=low|med|high how much bt merging in leak check [low]
-show-reachable=no|yes show reachable blocks in leak check? [no]

4. 介绍
valgrind包含几个标准的工具,它们是:
1、memcheck
   memcheck探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete调用。因此memcheck工具能够探测到以下问题:
    1)使用未初始化的内存
    2)读/写已经被释放的内存
    3)读/写内存越界
    4)读/写不恰当的内存栈空间
    5)内存泄漏
    6)使用malloc/new/new[]和free/delete/delete[]不匹配。
2、cachegrind
   cachegrind是一个cache剖析器。它模拟执行CPU中的L1, D1和L2 cache,因此它能很精确的指出代码中的cache未命中。
   如果你需要,它可以打印出cache未命中的次数,内存引用和发生cache未命中的每一行代码,每一个函数,每一个模块和整个程序的摘要。
   如果你要求更细致的信息,它可以打印出每一行机器码的未命中次数。
   在x86和amd64上,cachegrind通过CPUID自动探测机器的cache配置,所以在多数情况下它不再需要更多的配置信息了。
3、helgrind
   helgrind查找多线程程序中的竞争数据。helgrind查找内存地址,那些被多于一条线程访问的内存地址,但是没有使用一致的锁就会被查出。
   这表示这些地址在多线程间访问的时候没有进行同步,很可能会引起很难查找的时序问题。

标准调用方法是:
valgrind –tool=memcheck –leak-check=yes [command] [para]
其中command就是你的检测目标程序,para是该程序的参数
方便起见,可以自己做个alias,例如
alias memcheck=’valgrind –tool=memcheck –leak-check=yes’
放入~/.bashrc中,避免了每次都敲那么长的字符串

5. 实例

文件main.cpp代码如下:

#include <stdlib.h>

void f()
{   
int* x = (int*)malloc(10 * sizeof(int));
x[10] = 0; 
}                  

int main(void)
{   
f();   
return 0; 
}

编译:

g++ -o test -Wall -g main.cpp

运行:

valgrind --tool=memcheck --log-file=./1.log --leak-check=full ./test 

1.log内容如下:

11610为运行程序的进程ID

==11610== Memcheck, a memory error detector
==11610== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==11610== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==11610== Command: ./test
==11610== Parent PID: 1982
==11610== 
==11610== Invalid write of size 4
==11610==    at 0x80484DF: f() (main.cpp:47)
==11610==    by 0x80484F1: main (main.cpp:53)
==11610==  Address 0x42d4050 is 0 bytes after a block of size 40 alloc'd
==11610==    at 0x4026444: malloc (vg_replace_malloc.c:263)
==11610==    by 0x80484D5: f() (main.cpp:46)
==11610==    by 0x80484F1: main (main.cpp:53)
==11610== 
==11610== 
==11610== HEAP SUMMARY:
==11610==     in use at exit: 40 bytes in 1 blocks
==11610==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==11610== 
==11610== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==11610==    at 0x4026444: malloc (vg_replace_malloc.c:263)
==11610==    by 0x80484D5: f() (main.cpp:46)
==11610==    by 0x80484F1: main (main.cpp:53)
==11610== 
==11610== LEAK SUMMARY:
==11610==    definitely lost: 40 bytes in 1 blocks
==11610==    indirectly lost: 0 bytes in 0 blocks
==11610==      possibly lost: 0 bytes in 0 blocks
==11610==    still reachable: 0 bytes in 0 blocks
==11610==         suppressed: 0 bytes in 0 blocks
==11610== 
==11610== For counts of detected and suppressed errors, rerun with: -v
==11610== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 17 from 6)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值