在Apache httpd及其模块中寻找内存泄漏问题

8
什么是查找Apache httpd和httpd模块中内存泄漏的最佳方法?
是否有任何操作指南?
我尝试了一下valgrind,但遇到了一些障碍:
1. Valgrind希望二进制文件正常退出。我已经通过MaxRequestsPerChild和-X参数实现了这一点。
2. Valgrind报告了许多内容,可能与apr池相关,但没有有用的信息。
操作系统: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个回答

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用户邮件列表非常有帮助且非常宽容。您还可以在那里发布您最烦人和无关紧要的噪音,您将很快得到如何抑制它的答复。

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


我已经添加了valgrind输出。有很多东西,其中一些来自我的模块。 - Marko Kevac

0

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

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接