在Apache httpd和模块中搜索内存泄漏

Mar*_*vac 8 linux apache valgrind memory-leaks

在Apache httpd和httpd模块中查找内存泄漏的最佳方法是什么?

有什么声音吗?

我尝试了一点valgrind,但很少出现障碍:

  1. Valgrind希望二进制文件正常退出.我已经设法使用MaxRequestsPerChild和-X参数.
  2. Valgrind报告了很多东西,可能与apr池有关,但没什么用处.

操作系统:Linux

PS:

Valgrind命令: $ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X

Valgrind输出示例:http://paste-it.net/public/x5b6e8b/

小智 2

我不知道有什么灵丹妙药,但你可以看看 valgrind/valgrind.h ,它有一些有用的宏,可以让 Valgrind 意识到并改变它们在 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 */
}
Run Code Online (Sandbox Code Playgroud)

您还可以将整个混乱包裹起来,NDEBUG使其远离生产版本。

这应该可以让您不必在每次调试时摆弄服务器,如果检测到 Valgrind,它就会“直接执行”。RUNNING_ON_VALGRIND 将扩展到 valgrind 实例,或者如果不适用则保留为 0。

对于其余部分(我想象您会收到大量噪音,最有可能从 开始invalid read of size xx),您可以系统地应用抑制。如果您发布一些输出,则可以更轻松地为可以粘贴在文件中的抑制提出建议。

顺便说一下,Valgrind 用户的邮件列表非常有帮助并且非常宽容。您还可以在那里发布您最烦人且不相关的噪音,您会得到有关如何快速抑制它的回复。

如果您想要的只是泄漏的摘要以及导致泄漏的入口点,那么关闭几乎所有其他内容应该不会太困难。