2012-06-11 228 views
4

我們在Linux上運行着一個大型多線程C++應用程序。我們看到應用程序內存佔用增長很快,並認爲存在一些泄漏。我們嘗試了我們所有的工具(valgrind,DynLeak,Purify),但沒有找到任何東西。由於這個應用程序可以在Windows上運行,我們也嘗試了Bounds Checker。也沒有幫助。Linux上多線程C++應用程序中的內存泄漏

我們需要一個可以提供幫助的新工具。我曾看過Google Perfomrance Tools,MemCheck Deluxe的Paul Nettle的MMGR。他們沒有給我留下深刻的印象。

是否有任何地方有這個任務的好工具?

+4

如果上述工具無法找到泄漏,那麼您認爲是否有泄漏?你的應用程序可能只是使用所有的內存。或者,即使它沒有使用它,你的應用仍然保留着內存。對於最後一種情況,不會有泄漏,只是內存使用或清理效率低下。 –

+0

也許[this](http://blogs.msdn.com/b/ie/archive/2007/11/29/tools-for-detecting-memory-leaks.aspx)可以提供幫助。但是如果沒有使用其他工具檢測到泄漏,你怎麼能確定存在內存泄漏? –

+0

泄漏可能存在於第三方庫中,或者您可能只是在應用程序或操作系統中看到資源池和其他緩存的結果......大內存使用不一定是內存泄漏的標誌。看看它是否在相同的負載下不斷增長。 – AJG85

回答

2

如果通過「沒有幫助」,你的意思是它沒有報告內存泄漏,這是很有可能你沒有一個,只是使用越來越多的內存仍然是由指針引用,可以刪除。

+0

不幸的是,我們確實有一些東西。幾個月前,應用程序在未經確認的更改後開始表現如此。這是我們尋找泄漏​​的原因。 – GMichael

+1

@Michael:您是否嘗試過通過您的版本控制系統進行二分搜索以確定導致泄漏的提交? – thkala

+0

我希望這是可行的。我們有幾十個開發人員在開發應用程序。 – GMichael

5

C/C++中內存泄漏的定義非常具體:它是已分配的內存,然後指針被覆蓋或丟失。 Valgrind通常會立即檢測這種情況,但情況並非總是如此簡單。

  • 您的應用程序可能仍然使用該內存。在那種情況下,你可能會有什麼樣的程序員會考慮泄漏,例如,在一個結構中輸入數據,很少(或從不)刪除條目。

  • 您可能會錯誤地測量內存的內存使用情況。在Linux上,內存使用量測量並不像看起來那麼直截了當。你如何衡量你的內存使用情況?

  • 您應該考慮使用您正在使用的任何內存分析工具的應用程序掛鉤(Valgrind稱它們爲client requests),以避免僅在程序終止時發出的報告問題。使用這些鉤子可能會幫助您確定泄漏的位置。

  • 您應該嘗試使用來自Valgrind的堆分析器(例如massif)查找具有過多分配內存的內存分配位置。

  • 確保在應用程序中未使用自定義分配器或垃圾回收器。據我所知,沒有內存分析工具將使用自定義分配器,沒有user interference

  • 如果您的內存泄漏足夠大,可以在可接受的應用程序運行時間內檢測到,您可以嘗試通過版本控制系統對舊版本進行二進制搜索以確定引入該問題的提交。至少MercurialGit爲此任務提供了內置支持。

1

爲了幫助您調試問題,也許在你的記錄,你也應該寫的內存大小,數量的對象(其類型)和其他一些統計數據,其是對你有用的。至少在你更熟悉你提到的工具之前。

+1

+1用於應用程序內日誌/調試代碼。在我的一個應用程序中,我必須檢查Windows上的內存泄漏。在那個平臺上我沒有任何工具可用,我寫了一個'malloc()'和'free()'的包裝器,用於跟蹤所有的內存分配和釋放。一個相當極端的解決方案,但它的工作! – thkala

+0

我同意你的意見並向我們的經理提議。儘管如此,我還是希望爲這項工作找到一個行之有效的工具。你的方式非常複雜和令人厭煩。但是,如果沒有任何幫助,我們會採取。 – GMichael