Valgrind介绍

Valgrind是一个用于构建动态分析工具的检测框架。Valgrind工具可以自动检测许多内存管理和线程漏洞,并详细分析您的程序。您还可以使用Valgrind来构建新工具。

Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind的体系结构如下图所示:

架构图

工具包

Memcheck

Memcheck检测内存管理问题,主要针对C和C++程序。当一个程序在Memcheck的监督下运行时,所有对内存的读取和写入都会被检查,并拦截对malloc/new/free/delete的调用。因此,Memcheck可以检测您的程序是否:

  • 访问不应该访问的内存(尚未分配的区域、已释放的区域、超过堆块末尾的区域、堆栈中不可访问的区域)。
  • 以危险的方式使用未初始化的值。
  • 内存泄漏。
  • 对堆块执行错误的释放(双重释放、不匹配的释放)。
  • 将重叠的源内存块和目标内存块传递给memcpy()和相关函数。

Memcheck会在这些错误发生时立即报告,给出发生错误的源行号,以及为到达该行而调用的函数的堆栈跟踪。Memcheck在字节级别跟踪可寻址性,在位级别跟踪值的初始化。因此,它可以检测单个未初始化位的使用,并且不会报告位字段操作中的虚假错误。Memcheck运行的程序比正常速度慢10-30倍。

Cachegrind

Cachegrind是一个缓存探查器。它对CPU中的I1、D1和L2缓存执行详细的模拟,因此可以准确地确定代码中缓存未命中的来源。它通过每个函数、每个模块和整个程序摘要来识别每行源代码的缓存未命中、内存引用和执行的指令的数量。它适用于用任何语言编写的程序。Cachegrind运行的程序比正常速度慢20-100倍。

Callgrind

Josef Weidendorfer的Callgrind是对Cachegrind的扩展。它提供了Cachegrind所做的所有信息,以及关于调用图的额外信息。它在3.2.0版本中被集成到Valgrind的主版本中。单独提供的是一个令人惊叹的可视化工具KCachegrind,它可以更好地概述Callgrind收集的数据;它还可以用于可视化Cachegrind的输出。

Massif

Massif是一个堆探查器。它通过获取程序堆的定期快照来执行详细的堆评测。它生成一个图表,显示堆使用情况随时间的变化,包括程序中哪些部分负责最多内存分配的信息。该图由一个文本或HTML文件补充,该文件包括更多信息,用于确定在哪里分配了最多的内存。Massif运行程序的速度比正常速度慢20倍。

Helgrind

Helgrind是一个线程调试器,用于在多线程程序中查找数据竞赛。它查找由多个(POSIX p-)线程访问的内存位置,但找不到一致使用的(pthread_mutex_)锁。这样的位置指示线程之间缺少同步,并且可能导致难以找到与定时相关的问题。它对任何使用pthreads的程序都很有用。这是一个有点实验性的工具,所以这里特别欢迎您的反馈。

DRD

DRD是一种用于检测多线程C和C++程序中错误的工具。该工具适用于任何使用POSIX线程原语或使用在POSIX线程基元之上构建的线程概念的程序。虽然Helgrind可以检测到违反锁定顺序的情况,但对于大多数程序来说,DRD执行其分析所需的内存较少。

Lackey,Nulgrind

Lackey和Nulgrind也包括在Valgrind分布中。它们做的不多,只是为了测试和演示。

DHAT

DHAT是一个用于检查程序如何使用堆分配的工具。它跟踪分配的块,并检查每次内存访问,以找到要访问的块(如果有的话)。它还附带了一个GUI,以便于探索配置文件结果。

实验工具

BBV

基本块是具有一个入口点和一个出口点的代码的线性部分。基本块矢量(BBV)是程序执行期间输入的所有基本块的列表,以及每个基本块运行的次数。

BBV是一种生成基本块向量的工具,用于SimPoint分析工具。

SG检查

SGCheck是一个用于查找堆栈和全局数组溢出的工具。它的工作原理是使用启发式方法,该方法源于对堆栈和全局数组访问的可能形式的观察。

其他工具

已经创建了其他几个Valgrind工具:您可以在Variants/Patches页面上找到它们的列表。

命令行参数

用法:

1
valgrind [options] prog-and-args [options]

通用

  • -tool=<name> 指定工具名,默认是memcheck
  • -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介绍
https://blog.jackeylea.com/valgrind/intro-of-valgrind/
作者
JackeyLea
发布于
2024年3月23日
许可协议