跟踪大型代码库中的内存泄漏

时间:2012-08-13 23:15:41

标签: php codeigniter memory-leaks xhprof

对于使用CodeIgniter构建的应用程序,我有一个相对较大的PHP代码库(数千行)。为了能够跟踪性能问题并能够生成统计信息等,开发服务器运行Xhprof。如果脚本实际到达日志记录部分,这样可以正常工作。

但是,我现在遇到的情况是剧本只是超时了。在开发服务器上,它只是提供了一个超时(“未找到服务器”)错误,有时甚至会崩溃Apache进程。没有生成Xhprof文件,CodeIgniter日志记录系统不生成任何内容。错误报告IS enabeled。

在实时环境(实时服务器的镜像)上,应用程序实际上会生成错误:

  

致命错误:第493行/home/www/application/system/database/drivers/mysql/mysql_driver.php中允许的内存大小为33554432字节(尝试分配261900字节)

这一点,以及如何重现错误的线索,给了我一些预感,从哪里开始困扰解决方案。但这是一项耗时的工作。

我正在寻找一种能够追踪实际“内存泄漏”发生的方法。 而不是手动调试一行一行。非常感谢任何建议。

更新:服务器的低内存不是问题。在具有更多内存的开发服务器上,会出现同样的问题。问题是无限循环,分配更多的内存然后我的服务器可以处理。问题仍然存在:如何快速追踪这些错误?

2 个答案:

答案 0 :(得分:2)

打算保留统计信息的程序的一个常见问题是保留指向它们触摸的所有内容的指针,这会阻止内存管理回收它们。如果不是这种情况,这可能不是泄漏,它可能只是一个失控的分配。你可能只有几个地方可能会这样做。一个好的开始是替换对系统功能的直接调用 用你自己的函数分配内存块,然后检查这些函数,看 意外的大数组分配。

根据现代标准,报价上限(32mb)并不是很大。可能很容易就是没有错,除非这个过程有一个不合理的低限制。

答案 1 :(得分:2)

使用xdebug。与xhprof相反,使用xdebug进行分析会在脚本运行时生成输出,这意味着即使脚本挂起或超时,您也可以分析截至该点生成的跟踪。

另请参阅Profiling with xdebug以开始使用。