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

valgrind的使用

阅读更多

 

Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。

Valgrind的主要功能

Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:

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)

Callgrind

Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。

Cachegrind

它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。

Helgrind

它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。

Massif

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

Valgrind 安装

1、 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2

2、 解压安装包:tar –jxvf valgrind-3.2.3.tar.bz2

3、 解压后生成目录valgrind-3.2.3 

4、 cd valgrind-3.2.3

5、 ./configure

6、 Make;make install

Valgrind 使用

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

-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]

Valgrind 使用举例

下面是一段有问题的C程序代码test.c

#i nclude <stdlib.h>

void f(void)

{

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

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

}                  //问题2: 内存没有释放

int main(void)

{

   f();

   return 0;

 }

1、 编译程序test.c

gcc -Wall test.c -g -o test

2、 使用Valgrind检查程序BUG

valgrind --tool=memcheck --leak-check=full ./test

3、 分析输出的调试信息

==3908== Memcheck, a memory error detector.

==3908== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.

==3908== Using LibVEX rev 1732, a library for dynamic binary translation.

==3908== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.

==3908== Using valgrind-3.2.3, a dynamic binary instrumentation framework.

==3908== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.

==3908== For more details, rerun with: -v

==3908== 

--3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50

--3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50

/*数组越界错误*/

==3908== Invalid write of size 4      

==3908==    at 0x8048384: f (test.c:6)

==3908==    by 0x80483AC: main (test.c:11)

==3908==  Address 0x400C050 is 0 bytes after a block of size 40 alloc'd

==3908==    at 0x40046F2: malloc (vg_replace_malloc.c:149)

==3908==    by 0x8048377: f (test.c:5)

==3908==    by 0x80483AC: main (test.c:11)

==3908== 

==3908== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 1)

==3908== malloc/free: in use at exit: 40 bytes in 1 blocks. 

==3908== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

==3908== For counts of detected errors, rerun with: -v

==3908== searching for pointers to 1 not-freed blocks.

==3908== checked 59,124 bytes.

==3908== 

==3908== 

/*有内存空间没有释放*/

==3908== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==3908==    at 0x40046F2: malloc (vg_replace_malloc.c:149)

==3908==    by 0x8048377: f (test.c:5)

==3908==    by 0x80483AC: main (test.c:11)

==3908== 

==3908== LEAK SUMMARY:

==3908==    definitely lost: 40 bytes in 1 blocks.

==3908==      possibly lost: 0 bytes in 0 blocks.

==3908==    still reachable: 0 bytes in 0 blocks.

==3908==         suppressed: 0 bytes in 0 blocks.

分享到:
评论

相关推荐

    valgrind的使用方法-详细手册.

    内存检查工具valgrind 的使用方法,通过valgrind 可以检查程序中的内存情况。

    Valgrind使用概览与总结

    Valgrind使用概览与总结.详细说明了Valgrind的使用方法以及各工具的选项和使用方法。

    valgrind在android板上使用

    亲测可以正常使用的valgrind在android板子上使用,对于需要用valgrind检测内存泄漏等问题的开发者有参考价值。

    valgrind 使用手册

    valgrind 使用手册

    valgrind 介绍

    valgrind是一款运行在linux下的,用来定位c/c++程序中内存使用方面的错误的工具,包括:内存泄漏、使用未初始化的内存、读/...四、Valgrind使用方法 五、Valgrind使用参数 六、举例:valigrind在isearch3.2测试中的应用

    valgrind的使用方法-详细手册

    valgrind的使用方法-详细手册

    cpplint和valgrind使用详解及通用脚本

    本压缩包内包含了详细的cpplint和valgrind的使用说明,以及配置Eclipse批量格式化为Google风格代码时需要的脚本。 这两个脚本都经过了大型项目测试,绝对没问题。

    valgrind使用手册

    valgrind使用手册 This is the top level of Valgrind’s documentation tree. The documentation is contained in six logically separate documents, as listed in the following Table of Contents. To get ...

    Valgrind使用手册

    Valgrind用来调试C++程序的内存问题,比如内存泄露。本文档是Valgrind的使用手册。

    valgrind使用-检测内存

    介绍algrind的安装与使用方法,通过对内存错误的各种出错信息的认识,帮助使用者正确使用valgrind工具。是在ubuntu上编辑的,请在ubuntu上打开 参考:https://blog.csdn.net/u012662731/article/details/78652651 ...

    valgrind 使用

    valgrind 命令使用说明,没个命令有详细的汉子说明,并给出实例

    valgrind-3.15.0-manual.pdf

    valgrind-3.15.0的官方使用手册 valgrind-3.15.0的官方使用手册 valgrind-3.15.0的官方使用手册

    arm-linux-gnueabihf-valgrind-3.15.0.tar.gz

    arm-linux-gnueabihf-valgrind-3.15.0 arm-linux-gnueabihf端使用

    valgrind安装与使用

    valgrind安装与使用

    Valgrind简介和使用方法

    Valgrind的简介和使用方法,介绍了Valgrind的使用以及如何进行程序检查

    Valgrind使用说明

    valgrind 的安装 使用

    valgrind安装包 安装步骤 安装说明;以及一些检查内存泄漏的用法

    valgrind-arm64.zip

    valgrind内存检测工具使用方法: adb push .\valgrind-arm\Inst\data\local\Inst /data/local #adb shell #cd /data/local/Inst /data/local/Inst # chmod -R 777 bin /data/local/Inst # chmod -R 777 lib LD_...

Global site tag (gtag.js) - Google Analytics