valgrind如何运作?

时间:2009-11-01 02:30:12

标签: valgrind

有人可以提供Valgrind如何运作的快速顶级解释吗?一个例子:它如何知道何时分配和释放内存?

5 个答案:

答案 0 :(得分:95)

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

从手册:

  

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

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

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

答案 1 :(得分:28)

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

等工具
  1. Memcheck - 动态跟踪内存分配并报告内存泄漏。
  2. Helgrind - 检测并报告死锁,潜在数据争用和锁定逆转。
  3. Cachegrind - 模拟应用程序与系统缓存的交互方式,并提供有关缓存未命中的信息。
  4. Nulgrind - 一个从不做任何分析的简单的valgrind。开发人员用于性能基准测试。
  5. Massif - 分析应用程序堆内存使用情况的工具。
  6. Valgrind工具使用反汇编和重新合成机制,将应用程序加载到进程中,反汇编应用程序代码,添加用于分析的检测代码,将其组装回来并执行应用程序。它使用Just Intime Compiler(JIT)将应用程序嵌入到检测代码中。

                 Valgrind Tool = Valgrind Core + Tool Plugin
    

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

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

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

    8 phases of Valgrind

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)