站长资讯网
最全最丰富的资讯网站

php如何进行内存调试

php如何进行内存调试

内存调试

本章是有关PHP源代码的内存调试的简要介绍。 这不是一门完整的课程:内存调试并不难, 但是你需要一些它的使用经验,大量的练习可能是你在设计任何C编写的代码时都必须要做的事情。我们将在这里介绍一个非常著名的内存调试器: valgrind; 以及如何将其与PHP一起使用来调试内存问题。

相关学习推荐:PHP编程从入门到精通

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都是这种工具,它可以指出隐藏的瑕疵,准备好将其吹拂一次或以后。即使您认为代码似乎一切都很好,也可以使用它:您可能会感到惊讶。

Warning

您**必须在程序上使用valgrind(或任何内存调试器)。对于每个强大的C程序,要不调试内存就不可能100%充满信心。内存错误会导致有害的安全问题,并且程序崩溃通常取决于许多参数,通常是随机的。

内存泄漏检测示例

入门

Valgrind是一个完整的堆内存调试器。它还可以调试过程内存映射和功能堆栈。请在其文档中获取

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号