2013-08-21 164 views
4

我在Linux下的ARM CPU硬件上执行C++代码。我在硬件上运行我的二进制文件,并持续监视我的进程,以查看它的内存使用量是否随着时间的推移而增长,每隔半小时。C++代码内存泄漏

top -p pid-of-process 

看到列:RES内存和MEM%的最高输出

,并检查

cat /proc/pid-of-process/status 

看场VMRSS:这是驻留集大小的记忆里,处理。

我发现VMRSS和RES内存每1小时会持续增加数百KiloBytes。该进程正在运行,没有测试正在运行,所以它始终在做同样的事情,并且加载不会改变。

现在的问题我的是:这是否意味着我的代码中可能存在内存泄漏。

或者这个增加是否可以归因于别的东西,如果有的话?

要检查是否存在内存泄漏:

  1. 我审查代码,看看每一个新的(动态内存运营商)有一个相应的删除(空闲内存)

  2. 跑Valgrind的全过程memcheck,并在报告中没有看到任何泄漏。我看到

绝对丢失:0字节0块

间接丢失:0字节0块

可能丢失:1008个字节7块

* *编辑:回答下面的arne的评论。可能丢失的块来自pthread_create和glibc,所以不知道这是怎么回事?在5个街区

720个字节可能失去在损失记录56的27

== 11151 ==在0x402732C:释放calloc(vg_replace_malloc.c:467)

== 11151 ==通过0x4010C34 :allocate_dtv(DL-tls.c:300)

== 11151 ==由0x40113D8:_dl_allocate_tls(DL-tls.c:464)

== 11151 ==由0x404746C:在pthread_create @@ GLIBC_2。 1(allocatestack.c:571)**

随着时间的推移,这种内存增加会是什么?我如何进一步调试以找出原因?

+0

你是否重新检查过“可能丢失”的内存区域?它相当于1k,所以每小时可能有几百k时。 – arne

+0

'valgrind'只检查“孤立”(或“废弃”)的内存。很高兴接受'vector v; int i = 0; for(;;)v.push_back(i ++);'或类似的东西。换句话说,对于以荒谬的方式“收集”数据的功能来说,这没有任何帮助。当然,如果你不幸,这可能发生在一些辅助库中,而不是你自己的代码中。 –

+0

@Mats Petersson关于代码的初始审查,我不认为有任何C++ STL/libstdC++容器被使用,甚至标准数据类型数组以正常的方式被使用 – goldenmean

回答

0

既然你找不到直接泄漏,你似乎需要比较内存状态的快照,看看有什么变化。快速搜索表明,valgrind的地块可以做快照,并且有一个python script来比较它们(但如果你的程序很小,可能手工比较)