`
隐形的翅膀
  • 浏览: 496661 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Valgrind 使用简单说明

 
阅读更多
Valgrind 使用简单说明

本文部分参考网上相关资料。

Valgrind能做什么?
  •内存使用检测,包括:
    –内存泄漏
    –非法内存访问
    –未初始化变量使用
    –重复释放内存
  •多线程竞争
    –检测死锁

    -检测竞争

Valgrind还能做什么?
  •性能分析

    –Cachegrind+ cg_annotate

    它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数,这些可以看成程序的执行成本。以上数据其实对于app开发意义不大,仅作为参考。

  使用方法:

    –Callgrind+ callgrind_annotate/kcachegrind

       比起Cachegrind而言Callgrind更有用。Callgrind在Cachegrind基础上实现,可以可视化展示函数调用关系,以及每个函数在整个进程运行过程中所占的成本。对于

      




  •Helgrind/DRD
    –POSIXAPI误用
    –潜在的死锁提醒
    –数据竞争
  •Massif
    –内存分析工具,统计进程使用的内存情况,包括堆、栈

Valgrind—— memcheck 

  用法:valgrind--tool=memcheck--leak-check=yes ./grog

  输出:






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
    wget http://www.valgrind.org/downloads/valgrind-3.8.1.tar.bz2
    tar -xjvf linux-2.6.20.tar.bz2
3、 解压后生成目录valgrind-3.2.3
4、 cd valgrind-3.2.3
5、 ./configure
6、 Make;make installValgrind 使用


用法: 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

#include <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_安装使用说明-Howard.doc

    总的来说,Valgrind是软件开发中不可或缺的工具,它能够帮助开发者在早期阶段发现并修复潜在的内存错误,优化代码性能,特别是对于C和C++这样的语言,Valgrind的使用尤为重要。正确地使用Valgrind,可以极大地提高...

    valgrind_manual.pdf

    - **基本用法**:演示如何使用 Valgrind 进行简单的内存泄漏检查和性能分析。 - **高级功能**:介绍 Valgrind 的一些高级特性,如多线程支持、特定工具的使用等。 - **常见问题**:列出一些常见的问题及解决方法...

    MOCOR应用模块内存接口使用说明 V1.0.0

    常见的调试方法包括使用内存检测工具(如Valgrind等)、设置断点以及记录内存分配和释放的日志等。 #### 二、大块内存池内存(Block Memory)分配接口说明 ##### 2.1 采用大块内存池内存分配接口的原因 大块内存...

    举例说明如何实现内存泄露检测

    现在,让我们通过一个简单的C++例子来说明如何使用Valgrind检测内存泄露: ```cpp #include int main() { int* ptr = (int*)malloc(sizeof(int)); // 没有释放ptr,导致内存泄露 return 0; } ``` 编译并运行...

    unix常用命令简单说明

    5. **valgrind**:内存调试工具。帮助开发者检测内存泄漏和访问错误。 6. **doxygen**:文档生成器。从源代码注释中生成高质量的文档。 7. **git**:分布式版本控制系统。用于追踪对文件的修改,管理软件开发过程...

    一个简单的内存泄露的C++模块检测

    `README`文件可能包含了项目的使用说明和注意事项。开发者通常会在`README`中详细解释如何编译、运行测试以及如何解读检测结果。对于内存泄露检测,`README`可能会指导用户如何将这个模块集成到他们的代码中,以监控...

    NS3教程,高手绕道.doc

    下面是NS3的安装说明和简单的使用方法。 一、NS3的安装 NS3的安装需要一些必要的依赖项,包括gcc、g++、python、python-dev、mercurial、bzr、libgtk2.0-0、libgtk2.0-dev、gdb、valgrind、doxygen、graphviz、...

    ubuntu下安装ns-3

    `./waf –run hello-simulator`用于运行简单的示例程序,如果运行成功且无错误,说明ns-3已成功安装。 在实际操作中,可以编写无线网络拓扑的模拟脚本,例如将`examples/tutorial/third.cc`复制到`scratch`目录下...

    erlgrind:将fprof转换为callgring输出

    描述该脚本将erlang的fprof输出转换为valgrind的callgrind输出。 要生成fprof输出,请使用fprof:analyse({dest, "outfile.fprof"}). 。 不要使用总计。 转换为callgrind很简单,只需键入: ./erlgrind_script ...

    用mtrace分析内存泄露

    以一个简单的示例来说明mtrace的实际应用过程: 1. **修改源代码**:假设有一个名为`example.c`的程序,希望从程序中的`main`函数开始追踪内存分配情况。首先在`main`函数入口处调用`mtrace()`。 ```c #include ...

    ci_helloworld:一个简单的示例,说明如何为C和C ++设置完整的CI环境

    6. **动态分析** - 对于Valgrind或Google Sanitizers,会在运行时检查内存使用和其他潜在问题。 7. **报告结果** - CI服务会生成构建报告,显示是否所有步骤都成功,以及任何失败的测试或分析结果。 通过这个项目...

    检查代码内存泄露

    安装`cppcheck`相对简单,通常只需下载源代码,编译并安装到系统路径即可。对于那些没有安装经验的开发者,`cppcheck`附带的说明文档会提供详细的步骤指导。 使用`cppcheck`进行内存泄漏检测,首先需要在命令行中...

    面试资格确认c语言,一些常见的知识点以及简要说明

    - `if`: 最简单的条件分支语句,如 `if (age &gt; 18) printf("成年人");` - `if-else`: 提供两个选择路径,如 `if (age &gt; 18) printf("成年人"); else printf("未成年人");` - `if-elseif-else`: 支持多个条件分支...

    echo-nginx模块压缩包

    - **valgrind.suppress**: Valgrind抑制文件,用于忽略某些已知的内存检测问题。 - **.gitignore**: Git忽略文件,指定在版本控制中忽略的文件和目录。 - **LICENSE**: 许可证文件,说明了模块的授权方式,通常遵循...

    内存泄露工具介绍.docx

    本文主要介绍了在Windows系统中常用的内存泄露检测工具——Visual Leak Detector (VLD),以及一个简单的案例说明如何使用VLD进行内存泄露检测。 Visual Leak Detector是一款开源的内存泄露检测工具,专为Visual C++...

    测试工具,C语言代码编辑,单元测试工具

    "使用说明.txt"很可能是该工具或编辑器的用户指南,包含了如何安装和操作的详细步骤。“当下软件园.url”则是一个网址链接,可能指向了下载该工具或获取更多相关信息的网站。 总的来说,测试工具、C语言代码编辑器...

    轻松学习Linux编程

    而“说明.txt”可能是对文档的简要介绍或使用指南,可能包括阅读顺序、重点章节提示等内容。 总之,通过深入学习这个资料包,你可以逐步掌握Linux编程的核心技能,从而在Linux环境中游刃有余地开发和维护软件系统。...

    [BBservice]084.C++_Programming_How-To.v37.0.AV.[EN]

    如果仅仅是简单地更改类名无法解决问题,则需要采取更复杂的方法来避免命名冲突,比如使用命名空间。 ### 六、文件类简介 文件类在C++中主要用于文件的读写操作。通常会提供一些成员函数如`open()`用于打开文件,`...

    c c++师资培训资料

    - **内存泄漏检测**:通过工具如Valgrind检测程序中的内存泄漏问题。 ##### 2.3 内存页管理与动态内存管理 - **内存页管理**:现代操作系统中,内存是以页的形式管理的,每一页固定大小(如4KB),这有助于提高...

Global site tag (gtag.js) - Google Analytics