在 Apache httpd 和模块中搜索内存泄漏
Posted
技术标签:
【中文标题】在 Apache httpd 和模块中搜索内存泄漏【英文标题】:Searching for memory leaks in Apache httpd and modules 【发布时间】:2011-01-17 07:15:17 【问题描述】:在 Apache httpd 和 httpd 模块中查找内存泄漏的最佳方法是什么?
有什么方法吗?
我尝试了一些 valgrind,但几乎没有出现障碍:
-
Valgrind 期望二进制文件正常退出。我已经设法使用 MaxRequestsPerChild 和 -X 参数做到了。
Valgrind 报告了很多东西,可能与 apr 池有关,但没有任何用处。
操作系统:Linux
附:
Valgrind 命令:$ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X
Valgrind 输出示例:http://paste-it.net/public/x5b6e8b/
【问题讨论】:
【参考方案1】:我不知道有什么灵丹妙药,但你可以看看 valgrind/valgrind.h ,它有一些有用的宏可以让 Valgrind 感知并在运行时改变它们的行为瓦尔格林。
例如
#ifndef HAVE_VALGRIND_VALGRIND_H
#define RUNNING_ON_VALGRIND 0
#else
#include <valgrind/valgrind.h>
#endif
if (RUNNING_ON_VALGRIND)
printf("Hello, this is Valgrind instance %d\n", RUNNING_ON_VALGRIND);
/* set debug output annoyingly high */
/* exit after one request */
您还可以使用 NDEBUG
将整个混乱包裹起来,以防止它出现在生产版本中。
这应该可以让您不必在每次调试时都摆弄服务器,如果检测到 Valgrind,它将“只做”。 RUNNING_ON_VALGRIND 将扩展为 valgrind 实例,如果不适用,则保持为 0。
对于其余部分(我想您会收到大量噪音,很可能从 invalid read of size xx
开始),您可以系统地应用抑制。如果您发布一些输出,可能会更容易为您可以粘贴在文件中的抑制提出建议。
顺便说一句,Valgrind 用户的邮件列表非常很有帮助,而且非常宽容。你也可以在那里发布你最烦人和不相关的噪音,你会很快得到如何抑制它的回复。
如果您想要的只是泄漏的摘要以及导致泄漏的入口点,那么关闭几乎所有其他内容应该不会太难。
【讨论】:
我添加了 valgrind 输出。有很多东西,其中很少来自我的模块。【参考方案2】:您可以尝试集成 Bohem GC 并让垃圾收集来检测内存泄漏。
请参见此处了解操作方法:http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html
【讨论】:
【参考方案3】:也许是时候重构代码以便可以在 apache 之外运行测试了?
如果您添加检查分配内存的代码路径的单元测试,您可以通过在 valgrind 下运行单元测试来验证所有内存是否已释放。这样您就不必担心让在 apache 下运行的完整代码只处理少量事务。此外,使用单元测试来测试所有代码路径会更容易。
【讨论】:
以上是关于在 Apache httpd 和模块中搜索内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
在 Apache httpd 进程中定位内存泄漏,基于 PHP/Doctrine 的应用程序