valgrind如何运作?

ext*_*eee 76 valgrind

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

jhe*_*ngs 100

Valgrind基本上在"沙箱"中运行您的应用程序.在此沙箱中运行时,它可以插入自己的指令来执行高级调试和分析.

从手册:

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

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

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

  • Julian Seward撰写的这篇文章对Valgrind的设计进行了一些扩展:http://courses.cs.washington.edu/courses/cse326/05wi/valgrind-doc/mc_techdocs.html (3认同)

Ash*_*van 31

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Valgrind的8个阶段

  • 您能否让我知道此信息的来源或包含这些详细信息的任何链接?谢谢。 (2认同)