在Apache httpd和httpd模块中查找内存泄漏的最佳方法是什么?
有没有怎样的声音?
我尝试了一点valgrind,但几乎没有出现障碍:
操作系统: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/
答案 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下运行完整代码只需处理少量事务。此外,使用单元测试测试所有代码路径也会更容易。