valgrind 如何以及何时检测内存泄漏

问题描述 投票:0回答:3

我的代码中存在内存泄漏。堆随着流程的触发而不断增加。 在我的代码中,我有一个 while(1) 循环,它基本上等待队列。 当从 Web 服务触发该流程时,传入的消息将被推送到队列中,并调用 C++ 中的方法来获取消息并实现图形形式的流程。

对于每个触发器,我发现堆中的内存增加了 604kb。我需要解决这个问题。

我停止了服务[在产品中运行的二进制文件]。

我使用 valgrind 启动服务 [将二进制文件作为 valgrind 的输入]

valgrind  --log-file=/home/valgrind-output.txt --leak-check=full <service binary>

但是,当二进制文件运行时,它没有显示任何泄漏,只有当我停止服务时,我才看到一些泄漏。但这些是一次性泄漏,一旦我们重新启动服务,就会被清除。[二进制文件]。

我特意在触发每个流程时在流程开始时添加了分配。

 int *p = new int[10];

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

如何检查每个流程调用之间的泄漏? valgrind 仅在调用 main 结束后才会发生泄漏吗?在这种情况下,如何动态检查我的代码导致的泄漏。 我是否需要安装其他探测器?请建议。这会有很大帮助。谢谢。

c++ memory valgrind memory-leaks
3个回答
2
投票

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

如果您想在长时间运行的程序中查找泄漏,您需要插入一个退出调用(中止程序),该调用将在程序运行一段时间后发生,并且它会向您显示当时泄漏的内容。


0
投票

这是一个非常hacky的解决方案,但我了解到,如果您使用fork()并立即退出它,Valgrind将进行完整的堆栈跟踪,并且原始程序仍然运行。


-2
投票

使用 -massif 它可以为您提供详细的输出,其中内存与所有调用堆栈一起分配。

© www.soinside.com 2019 - 2024. All rights reserved.