valgrind如何工作?


79

有人可以提供有关Valgrind工作原理的简要说明吗?一个例子:如何知道何时分配和释放内存?

Answers:


105

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

从手册中:

然后,您的程序将在Valgrind内核提供的合成CPU上运行。首次执行新代码时,核心会将代码移交给所选工具。该工具为此添加了自己的检测代码,并将结果传递回内核,该内核协调了该检测代码的继续执行。

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

这种方法的优点在于,您不必修改或重新链接程序就可以在valgrind中运行它。它的确会使您的程序运行速度变慢,但是valgrind并不是要衡量性能或在应用程序正常执行期间运行,因此这并不是真正的问题。


3
:本文Julian Seward写扩展了Valgrind的设计有点courses.cs.washington.edu/courses/cse326/05wi/valgrind-doc/...
user11171

34

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

  1. Memcheck-动态跟踪内存分配并报告内存泄漏。
  2. Helgrind-检测并报告死锁,潜在的数据争用和锁逆转。
  3. Cachegrind-模拟应用程序如何与系统缓存交互,并提供有关缓存未命中的信息。
  4. Nulgrind-从未进行任何分析的简单valgrind。开发人员用于性能基准测试。
  5. Massif-分析应用程序堆内存使用情况的工具。

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

             Valgrind Tool = Valgrind Core + Tool Plugin

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

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

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

瓦格隆8个阶段


您能否让我知道此信息的来源或包含这些详细信息的任何链接?谢谢。
mezda

4

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



2

Valgrind本质上是执行程序的虚拟机。它是一种虚拟体系结构,可拦截每个分配/释放内存的调用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.