2013-08-21 161 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來比較它們(但如果你的程序很小,可能手工比較)