Valgrind如何检测内存泄漏,以及何时检测到?

4
我在代码中发现了一个内存泄漏问题。随着流程的触发,堆栈不断增长。
我的代码中有一个 while(1) 循环,它基本上在等待队列。
当来自 Web 服务的流程被触发时,会将传入的消息推送到队列中,并调用 C++ 中的方法,该方法接收消息并实现以图形形式呈现的流程。
每次触发时,我发现堆栈中的内存增加了 604KB。我需要解决这个问题。
我停止了服务 [在生产环境中运行的二进制文件]。
我使用 valgrind 启动了服务 [将二进制文件作为输入提供给 valgrind]。
valgrind  --log-file=/home/valgrind-output.txt --leak-check=full <service binary>

然而,当二进制程序运行时,它并不会显示任何泄漏,只有在停止服务后才会看到一些泄漏。但这些泄漏只出现一次,一旦我们重新启动服务[binary],它们就会被清除。

我故意在每个流程触发时,在进程开始时添加了一个分配。

 int *p = new int[10];

我还添加了一个日志。每次触发流程时,我都会看到日志打印。但是我没有在输出文件中看到Valgrind给出的任何泄漏。

我该如何检查每次流程调用之间的泄漏?Valgrind只有在调用main函数结束时才显示泄漏吗?如何动态地检查我的代码在这种情况下造成了哪些泄漏。如果需要安装其他检测器,请建议。这将是极大的帮助。谢谢。

3个回答

2

valgrind只在程序退出时检查内存泄漏。此时,它会跟踪从堆栈和全局变量可访问的所有内存,任何不可访问的内容都被认为是泄漏。

如果您想在长时间运行的程序中查找泄漏,您需要插入一个调用exit(终止程序),该调用将在其运行一段时间后发生,并显示此时已泄漏了什么。


只有在我停止服务时才会看到一些泄漏。但这些是一次性泄漏,一旦我们重新启动服务就会清除。[二进制]。我无法区分我在 while(1) 循环中失去了什么内存。 - user862833
也许你应该为服务实现一个关闭命令 - 发送一些特定的内容来明确地关闭它。 - Arne Mertz
在Valgrind中有没有一种方法可以打印堆中进行的每个分配? - user862833

0
这是一个非常巧妙的解决方案,虽然有些取巧,但我发现如果你使用fork()并立即退出,Valgrind将会进行完整的堆栈跟踪,而原始程序仍然会继续运行。

-2

使用-massif可以给出详细的输出,显示内存分配情况以及所有调用栈。


valgrind --log-file=/home/valgrind-output.txt --leak-check=full --show-reachable=yes -massif servicebinaryvalgrind:选项错误:-massif valgrind:使用--help获取更多信息或查阅用户手册。 - user862833
--tool=massif 也可以在日志文件创建后使用 ms_print massif.log > massifout.txt; - Adnan Akbar
请将输出内容粘贴到此处。 - Adnan Akbar

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