现在的位置: 首页 > 综合 > 正文

linux valgrind检测工具概述

2013年06月25日 ⁄ 综合 ⁄ 共 2351字 ⁄ 字号 评论关闭

说明:本文转自 http://blog.csdn.net/sduliulun/article/details/7732906 感谢作者分享。

   

一、valgrind简介

 

   Valgrind是一款基于模拟linux下的程序调试器和剖析器的软件套件,可以运行于x86, amd64和ppc32构架上。valgrind包含一个核心,他提供一个虚拟的CPU运行程序,还有一系列的工具,而其他工具类似于插件,利用内核提供的服务完成各种特定的内存调试任务。valgrind的体系结构如下图所示:

点击看大图

 

Valgrind包括如下一些工具:

1、memcheck:探测程序中的内存管理存在的问题。它检测所有对内存的读写操作,并截取所有的malloc/new/new[]/free/delete/delete[],因此memcheck工具能探测如下内容:

    (1) 使用未初始化的内存;

    (2) 读/写已经被释放的内存;

    (3) 读/写内存越界;

    (4) 读/写不恰当的内存栈空间;

    (5) 内存泄露;

    (6) 使用malloc/new/new[]和free/delete/delete[]不匹配.

2、callgrind: 检查程序中函数调用出现的错误。

3、cachegrind: 它是一个cache剖析器,它模拟执行L1,D1和L2 cache,因此它能很精确的指出代码中的cache未命中。如果你需要,它可以打印出cache未命中的次数,内存引发和发生cache未命中的每一行代码,每一个函数,每一个模块,每一个程序的摘要。如果你要求更细致的信息,它可以打印出每一行机器码的未命中次数。在x86和amd64上,cachegrind通过CPUID自动探测机器的cache配置,所以在多数情况下它不再需要更多的配置信息了。

4、helgrind: 查找多线程中的竞争数据,helgrind查找内存地址,那些被多余一条线程访问的内存地址,但是没有使用一致的锁就会被查出.这表示这些地址在多线程访问的时候没有进行同步,很可能会引起很难查找的时序问题。

5、massif: 检查程序中堆栈使用中出现的问题。

6、extension: 可以利用core提供的功能,自己编写特定的内存检测工具。

 

二、linux下内存空间布局

 

典型内存空间布局

一个典型的linux C程序内存空间布局由如下几部分组成:

* 代码段(.text) : 这里是存放CPU要执行的指令。代码段是可以共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读的,防止因为程序错误而修改自身的指令。

* 初始化数据段(.data) : 这里存放的是程序中需要明确赋初值的变量,例如位于所有函数之外的全局变量: int val=100。

需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入。

* 未初始化数据段(.bbs) : 位于这一段的数据,内核哎执行该程序前,将其初始化为0或者null。例如出现在任何函数之外的全局变量 int num;

* 堆(heap) : 这个段用于在程序中动态申请内存,例如经常使用的malloc和new系列函数就是从这个段申请内存。

* 栈(stack) : 函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。

 

三、Valgrind使用

 

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

 

抱歉!评论已关闭.