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

时间:2010-02-16 08:08:53

标签: linux memory-leaks valgrind apache

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

有没有怎样的声音?

我尝试了一点valgrind,但几乎没有出现障碍:

  1. Valgrind希望二进制文件正常退出。我已经设法使用MaxRequestsPerChild和-X参数。
  2. Valgrind报道了很多东西,可能与apr池相关,但没什么用处。
  3. 操作系统:Linux

    P.S:

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

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

3 个答案:

答案 0 :(得分: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用户的邮件列表非常非常有用且非常宽容。你也可以在那里发布你最讨厌和无关的噪音,你会得到如何快速压制它的回复。

如果你想要的只是泄漏的总结和导致它们的切入点,那么关闭其他所有东西并不是太困难。

答案 1 :(得分:0)

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

请看这里的方法:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

答案 2 :(得分:0)

也许是时候重构代码了,这样你就可以在apache之外运行测试了?

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