valgrind 是如何工作的?

问题描述 投票:0回答:5

有人可以快速解释 Valgrind 的工作原理吗?举个例子:它如何知道内存何时被分配和释放?

valgrind
5个回答
133
投票

Valgrind 基本上在“沙箱”中运行您的应用程序。在这个沙箱中运行时,它能够插入自己的指令来进行高级调试和分析。

来自手册:

然后您的程序将在 Valgrind 核心提供的合成 CPU 上运行。当新代码第一次执行时,核心将代码交给选定的工具。该工具将自己的检测代码添加到其中,并将结果返回给核心,该核心协调该检测代码的继续执行。

基本上,valgrind 提供了一个执行您的应用程序的虚拟处理器。但是,在处理您的应用程序指令之前,它们会被传递给工具(例如 memcheck)。这些工具有点像插件,它们能够在您的应用程序在处理器上运行之前对其进行修改。

这种方法的优点是您根本不需要修改或重新链接您的程序即可在 valgrind 中运行它。它确实会导致您的程序运行速度变慢,但是 valgrind 并不意味着测量性能或在应用程序的正常执行期间运行,因此这并不是真正的问题。


41
投票

Valgrind 是一种动态二进制分析 (DPA) 工具,它使用动态二进制检测 (DPI) 框架来检查内存分配、检测死锁并分析应用程序。 DPI 框架有自己的低级内存管理器、调度程序、线程处理程序和信号处理程序。 Valgrind 工具套件包括类似工具

  1. Memcheck - 动态跟踪内存分配并报告内存错误、系统调用误用和内存泄漏。
  2. Helgrind - 检测并报告死锁、潜在的数据竞争和锁反转。
  3. DRD - 与 Helgrind 类似,以更少的错误信息换取更高的速度。
  4. Cachegrind - 配置文件指令执行并可选择模拟应用程序如何与系统缓存交互并提供有关缓存未命中的信息。
  5. Callgrind - 配置函数调用。
  6. DHAT - 配置文件堆分配、测量生命周期、访问计数和访问模式,
  7. Nulgrind - 一个简单的 valgrind,不添加任何仪器。供开发人员用于基本测试。
  8. Massif - 分析应用程序堆内存使用情况的工具。
  9. Lackey - 如何编写工具的示例。
  10. Exp-bbv -(实验性)基于采样的分析。

Valgrind 工具使用反汇编和重新合成机制,将应用程序加载到进程中,反汇编应用程序代码,添加用于分析的检测代码,将其组装回来并执行应用程序。它使用 Just Intime 编译器 (JIT) 将检测代码嵌入到应用程序中。

             Valgrind Tool = Valgrind Core + Tool Plugin

Valgrind Core 反汇编应用程序代码并将代码片段传递给工具插件进行检测。工具插件添加分析代码并将其组装回来。因此,Valgrind 提供了在 Valgrind 框架之上编写我们自己的工具的灵活性。 Valgrind 使用影子寄存器和影子内存来检测读/写指令、读/写系统调用、堆栈和堆分配。

Valgrind 提供系统调用的包装器,并为每个系统调用注册前回调和后回调,以跟踪作为系统调用一部分访问的内存。因此,Valgrind 是操作系统和客户端应用程序之间的操作系统抽象层。

该图说明了 Valgrind 的 8 个阶段:

8 phases of Valgrind



2
投票

valgrind 位于程序和操作系统之间的一层,拦截对操作系统请求内存分配(取消)分配的调用,并记录正在操作的内容,然后实际分配内存并传回等效内存。这本质上是大多数代码分析器的工作方式,除了在较低级别(系统调用而不是程序函数调用)。


2
投票

Valgrind 基本上是一个执行程序的虚拟机。它是一个虚拟架构,拦截每个分配/释放内存的调用。

© www.soinside.com 2019 - 2024. All rights reserved.