8

在 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/

4

3 回答 3

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 */
}

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

这应该使您不必在每次调试时都摆弄服务器,如果检测到 Valgrind,它将“就这样做”。RUNNING_ON_VALGRIND 将扩展为 valgrind 实例,如果不适用,则保持为 0。

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

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

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

于 2010-02-16T08:36:56.357 回答
0

您可以尝试集成 Bohem GC 并让垃圾收集来检测内存泄漏。

只需在此处查看操作方法:http:
//www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

于 2010-03-06T14:29:53.170 回答
0

也许是时候重构代码以便您可以在 apache 之外运行测试了?

如果您添加检查分配内存的代码路径的单元测试,您可以通过在 valgrind 下运行单元测试来验证所有内存是否已释放。这样您就不必担心让在 apache 下运行的完整代码只处理少量事务。此外,使用单元测试来测试所有代码路径会更容易。

于 2010-03-10T14:44:49.747 回答