valgrind

Valgrind 是许多 Unix 环境下使用的知名工具,可以在任何 C/C++ 编写的软件中调试许多常见的内存问题。 Valgrind 是有关内存调试的多功能前端工具。最常用的底层工具称为 “memcheck”。它的工作方式是用自己的堆分配替换每个 libc 的堆分配,并跟踪你对它们所做的事情。你可能还会对 “massif” 感兴趣:它是一个内存跟踪器,对于了解程序的常规堆内存使用情况非常有用。



注意



你应该阅读 Valgrind 文档,以进一步了解。 它写得很好,带有一些典型的例子。



为了进行内存分配替换,你需要通过 valgrind 运行要分析的程序(此处为 PHP),也就是启动 valgrind 二进制文件。



当 valgrind 替换并跟踪所有 libc 的堆分配时,它往往会大大降低调试程序的速度。对于 PHP,你会注意到它。尽管 PHP 的速度下降并不那么剧烈,但是仍然可以清楚地感觉到;如果你注意到它,不用担心,这是正常的。



Valgrind 不是你可能会使用的唯一工具,但是是最常用的工具。还有其他工具,例如 Dr.Memory、LeakSanitizer、Electric Fence、AddressSanitizer。



在开始之前
以下是在存储器调试方面具有良好经验并减轻发现缺陷并减少调试时间的机会所需的步骤:




  • 您应始终使用 PHP 的调试版本。尝试调试生产版本中的内存是无关紧要的。

  • 您应该始终在 USE_ZEND_ALLOC = 0 环境下启动调试器。您可能已经在 Zend Memory Manager 章节中了解到,此环境 var 会在当前进程启动时禁用 ZendMM。强烈建议在启动内存调试器时这样做。完全绕过 ZendMM 有助于了解 valgrind 生成的跟踪。

  • 强烈建议在环境 ZEND_DONT_UNLOAD_MODULES = 1 下启动内存调试器。这样可以防止 PHP 在过程结束时卸载扩展程序的.so 文件。这是为了获得更好的 valgrind 报告跟踪;如果在 valgrind 将要显示其错误时 PHP 将卸载扩展名,则稍后将不完整,因为从中获取信息的文件不再是进程内存映像的一部分。

  • 您可能需要一些抑制措施。当您告诉 PHP 在过程结束时不要卸载其扩展名时,可能会在 valgrind 输出中给您误报。将检查 PHP 扩展是否泄漏,如果您在平台上误报,则可以使用抑制功能将其关闭像这样。可以根据这样的示例随意编写自己的文件。

  • 与 Zend Memory Manager 相比,Valgrind 显然是更好的工具,可以查找泄漏和其他与内存相关的问题。您应该始终在代码上运行 valgrind,这实际上是每个 C 程序员都必须执行的步骤。无论是因为崩溃而想要找到并调试它,还是作为看起来好像没有任何坏处的高质量工具来运行它,valgrind 都是这种工具,它可以指出隐藏的瑕疵,准备好将其吹拂一次或以后。即使您认为代码似乎一切都很好,也可以使用它:您可能会感到惊讶。



https://learnku.com/docs/php-internals/php7/memory-debugging/7230
https://www.valgrind.org/docs/manual/ms-manual.html
https://www.valgrind.org/docs/manual/mc-manual.html
https://www.valgrind.org/
http://www.phpinternalsbook.com/php7/memory_management/zend_memory_manager.html


Category php