2011-12-26 33 views
7

我試圖尋找一個看起來像內存泄漏的服務器軟件中的一個非常回避性的錯誤,但memcheck根本沒有幫助。我的猜測是已經被實例化並且永遠不會被刪除的內存確實沒有被泄露,所以有一個對它的引用,但是現在對程序沒有用處,應該被刪除。 有沒有一種工具可以計算內存中的訪問次數,而不是引用次數,因此可以評估堆中對象的有效使用情況?列表「冷」內存區域

+1

Valgrind應報告從未被釋放爲「仍然可用」的東西;請參閱http://valgrind.org/docs/manual/faq.html#faq.deflost。 – 2011-12-26 17:40:15

+0

@oli - 您可能希望將您的評論發佈爲答案,以便將其標記爲已接受。無論如何,它看起來對我來說是正確的答案。 – casualcoder 2011-12-27 15:27:28

+0

我已經用這個程序運行memcheck,它沒有顯示任何東西。 – 2011-12-28 09:40:25

回答

4

我結束了我實現自己的工具。 我的方法與我的打算略有不同:我寫了一個malloc hooking library。它掛鉤了malloc,realloc和free,並且維護着一個活的malloc的內存塊列表。無論何時嚮應用程序發送SIGUSR1,它都會將其信息轉儲到文件中,並將其評估爲Mathematica表達式。 Mathematica筆記本終於提供了一些非常有用的圖表:頂級得分實例by call stack,以及calls to malloc的完整概述。使用這些工具,我只需將鼠標懸停在距離第二個圖形的中心綠點最遠,最遠的位置,並且,我有地址實例化了沒有泄漏但無用內存的負載。

P.S. 您可以在第二張圖中看到的循環調用肯定是libc的backtrace()中的一個錯誤。

+0

我很驚訝valgrind沒有做你想做的事,沒有發現內存泄漏valgrind沒有拿起我。 – dreamlax 2011-12-28 09:47:20

+0

由於另一個原因,這個bug非常難以捉摸:另一個人已經找到了在他的構建中可靠地觸發它的方法,但是這種方法對我來說不起作用(當然是同樣新鮮的未觸動的來源)。所以memcheck沒有爲我找到任何明顯的東西,但是這個人告訴我他做了memcheck,它什麼都沒有返回,我沒有理由認爲他做錯了什麼。圖表中顯示的數據也來自他的構建。我懷疑它與bitness有關,他構建了32位可執行文件,以便能夠在任何服務器上共享相同的內部版本,而我只構建了64位可執行文件。 – 2011-12-28 10:01:49

0

大概這個工具(Visual Leak Detector)會幫助你。 它是免費的。

http://vld.codeplex.com/

+0

它看起來像一個普通的泄漏檢測器,因爲我說我的問題是使用中的額外內存在技術上沒有泄漏,因爲仍然有對它的引用。另外,我正在使用gcc。 – 2011-12-27 09:53:01