有人可以提供有关Valgrind工作原理的简要说明吗?一个例子:如何知道何时分配和释放内存?
Answers:
Valgrind基本上在“沙盒”中运行您的应用程序。在此沙箱中运行时,它可以插入自己的指令以进行高级调试和性能分析。
从手册中:
然后,您的程序将在Valgrind内核提供的合成CPU上运行。首次执行新代码时,核心会将代码移交给所选工具。该工具为此添加了自己的检测代码,并将结果传递回内核,该内核协调了该检测代码的继续执行。
因此,基本上,valgrind提供了一个执行您的应用程序的虚拟处理器。但是,在处理您的应用程序指令之前,它们会传递给工具(例如memcheck)。这些工具有点像插件,它们能够在您的应用程序在处理器上运行之前对其进行修改。
这种方法的优点在于,您不必修改或重新链接程序就可以在valgrind中运行它。它的确会使您的程序运行速度变慢,但是valgrind并不是要衡量性能或在应用程序正常执行期间运行,因此这并不是真正的问题。
Valgrind是一个动态二进制分析(DPA)工具,它使用动态二进制工具(DPI)框架来检查内存分配,检测死锁并分析应用程序。DPI框架具有自己的低级内存管理器,调度程序,线程处理程序和信号处理程序。Valgrind工具套件包括类似
Valgrind工具使用反汇编和重新合成机制,将应用程序加载到进程中,反汇编应用程序代码,添加检测代码以进行分析,然后将其组装回并执行应用程序。它使用Just Intime Compiler(JIT)将应用程序与检测代码一起嵌入。
Valgrind Tool = Valgrind Core + Tool Plugin
Valgrind Core会反汇编应用程序代码,并将代码片段传递给工具插件以进行检测。工具插件会添加分析代码并将其重新组合。因此,Valgrind提供了在Valgrind框架之上编写我们自己的工具的灵活性。Valgrind使用影子寄存器和影子存储器来检测读/写指令,读/写系统调用,堆栈和堆分配。
Valgrind为系统调用提供了包装器,并为每个系统调用的前后回调进行注册,以跟踪作为系统调用一部分访问的内存。因此,Valgrind是Linux操作系统和客户端应用程序之间的OS抽象层。
该图说明了Valgrind的8个阶段:
在这里您可以找到一些不错的信息:
除了熟悉LD_PRELOAD。