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

ds97pgxw  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(112)

在我的代码中有一个内存泄漏。堆随着流的触发而不断增加。在我的代码中,我有一个while(1)循环,它基本上是在队列上等待。当该流从webservice触发时,传入的msg被推入队列,并调用c++中的一个方法,该方法接受消息并实现以图形形式的流。
对于每个触发器,我发现堆中增加了604kb的内存。我需要解决这个问题。
我停止了服务[prod中运行的二进制文件]。
我用valgrind启动了这个服务[把二进制文件作为输入给valgrind]

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

字符串
但是当二进制文件运行时,它没有显示任何泄漏,只有当我停止服务时,我才看到一些泄漏。但是这些都是一次性泄漏,一旦我们重新启动服务,就会被清除。[二进制]。
我有意在流程开始时,当每个流被触发时添加一个分配。

int *p = new int[10];


并且还添加了一个日志。我看到每次触发流时都会打印日志。但是我没有看到valgrind在输出文件中有任何泄漏。
我如何检查每个流调用之间的泄漏?valgrind是否只在main的末尾被调用时才启动泄漏?如何动态检查在这种情况下我的代码导致的泄漏。如果我需要安装任何其他检测器?请建议。这将是很大的帮助。谢谢。

cetgtptt

cetgtptt1#

valgrind只在程序退出时检查内存泄漏。此时,它会跟踪所有从堆栈和全局变量可访问的内存,任何无法访问的内存都被认为是泄漏。
如果你想在一个长时间运行的程序中找到漏洞,你需要插入一个exit调用(中止程序),这个调用将在程序运行一段时间后发生,它会显示在那一点上有什么泄漏。

ipakzgxi

ipakzgxi2#

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

xesrikrc

xesrikrc3#

如果使用-blog,它会给出详细的输出,其中内存被分配给所有调用堆栈。

相关问题