2013-03-01 147 views
3

我的代码中有内存泄漏。堆随着流的触发而增加。 在我的代码中,我有一个while(1)循环,它基本上在队列中等待。 当从webservice触发该流时,将传入消息推入队列,并调用C++中的方法,该方法接受消息并实现图形格式的流。valgrind如何检测内存泄漏

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

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

我开始用的valgrind [给二进制输入到的valgrind]服务

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

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

我在流程启动时有意添加了一个分配,当每个流程被触发时。

int *p = new int[10]; 

,并添加日志also.I看到日志打印用我每次触发flow.But时候,我看到DONOT给Valgrind的输出文件中的任何泄漏。

我该如何检查每个流程之间的泄漏? valgrind只有在主叫结束后才会泄漏鞋底?如何动态检查我的代码在这种情况下导致了什么泄漏。 如果还有其他探测器需要安装?请提出建议,这会有很大的帮助。谢谢。

回答

-1

使用-massif它为您提供详细的输出内存正在分配所有的调用堆栈。

+0

>的valgrind --log文件= /家庭/的valgrind-output.txt的--leak检查=全--show-可达= YES -massif servicebinary 的valgrind:坏的选择:-massif 的valgrind:用途 - 有关更多信息,请参阅用户手册。 – user862833 2013-03-01 08:24:30

+0

--tool = massif也是在创建日志文件之后使用ms_print massif.log> massifout.txt; – 2013-03-01 08:27:29

+0

不,这是行不通的 – user862833 2013-03-01 13:51:05

1

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

如果你想在长时间运行的程序中发现泄漏,你需要插入一个调用来退出(中止程序),它会在运行一段时间后发生,它会告诉你什么泄漏了那一点。

+0

只有当我停止服务,我看到一些leaks.But这些是一次性泄漏,一旦我们重新启动服务将被清除。[二进制]。 Iam无法分辨while(1)循环中内存iam丢失的内存。 – user862833 2013-03-01 08:26:06

+0

也许你应该为服务实施一个shotdown命令 - 发送特定的东西来显式关闭它。 – 2013-03-01 08:39:43

+0

valgrind中有没有什么办法可以打印堆中的每个分配? – user862833 2013-03-01 13:50:26