【问题标题】:Searching for memory leaks in Apache httpd and modules在 Apache httpd 和模块中搜索内存泄漏
【发布时间】:2011-01-17 07:15:17
【问题描述】:

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

有什么方法吗?

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

  1. Valgrind 期望二进制文件正常退出。我已经设法使用 MaxRequestsPerChild 和 -X 参数做到了。
  2. 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/

【问题讨论】:

    标签: linux memory-leaks valgrind apache


    【解决方案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 下运行的完整代码只处理少量事务。此外,使用单元测试来测试所有代码路径会更容易。

      【讨论】:

        猜你喜欢
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多