2014-06-18 98 views
5

假設我有一個C程序(在Linux下運行),它處理許多數據結構,一些複雜的數個結構可以增長和縮小,但通常不會隨着時間增長。隨着時間的推移,程序被觀察到RSS逐漸增加(比內存碎片可以解釋更多)。我想找出什麼在泄漏。運行在valgrind這裏是明顯的建議,但valgrind(與--leak-check=full--show-reachables=yes)顯示沒有泄漏。我相信這是因爲數據結構本身在退出時正確地被釋放,但其中一個在程序生命週期中正在增長。例如,可能有一個鏈接列表隨着時間的推移正在線性增長,有人忘記刪除列表上的資源,但退出清理正確地釋放了退出時列表上的所有項目。當然,如果它們被釋放,這些實際上是否是「泄漏」(因此問題中的引號),這是一個哲學問題。檢測退出時釋放的C內存「泄漏」

是否有任何有用的工具來測試它?我最喜歡的是能夠在valgrind下運行,並且能夠產生一個當前分配報告,就像它在退出時一樣,但是讓這種情況發生在一個信號上並允許程序繼續。然後,我可以查找堆棧跟蹤簽名對他們的增長分配情況。

我可以可靠地從gdbgenerate-core-file得到一個很好的大'核心'文件;有沒有什麼方法可以分析脫機,如果說我編寫了一個方便的malloc()調試庫,儀器malloc()

我可以完全訪問源代碼,並且可以對其進行修改,但我並不真正想手動測試每個數據結構,而且我對該問題的一般解決方案感興趣(如提供valgrind)而不是如何解決這個特定的問題。

我看了有關此處類似的問題,但他們似乎都爲:

  • 爲什麼我的程序內存泄漏?
  • 如何檢測退出時的內存泄漏? (對我沒用)
  • 如何檢測核心文件中的內存泄漏? (很好,但沒有一個滿意答案)

如果我在Solaris下運行,我猜測答案是'使用這個方便的dtrace腳本'。

+0

我是valgrind的基金,我非常確定valgrind會告訴你這些「泄漏」。如果你釋放列表項並忘記釋放列表項中的資源,這些將顯示在valgrind中,因爲「肯定丟失了」。只是不要使用'--show-reachables = yes',因爲這會隱藏我剛剛解釋的內容,因爲它實際上是無法訪問的。 – Montaldo

+1

他只是混淆了術語。只要內存可用,它不會丟失或泄漏。請重寫問題,並避免使用「泄漏」一詞。這不是泄漏。 –

+0

@Montaldo我對'valgrind'非常熟悉;它沒有顯示泄漏,因爲它們在退出時被釋放。 – abligh

回答

5

Valgrind包含一個gdbserver。這基本上意味着你可以使用gdb來連接它,例如發出泄漏轉儲,或在運行時顯示所有可訪問的內存。當然,您必須判斷是否存在「內存泄漏」,因爲valgrind無法知道應用程序邏輯中是否存在未能釋放內存的錯誤,但仍然引用它。

運行Valgrind的與--vgdb = YES標誌,然後運行命令:

valgrind --vgdb=yes --leak-check=full --show-reachable=yes ./yourprogram 
gdb ./yourprogram 
(gdb) target remote | vgdb 
(gdb) monitor leak_check full reachable any 

查看文檔的更多信息,herehere

你也可以做到這一點programatically在你的程序

#include <valgrind/memcheck.h> 

,並在代碼中的適當位置做:

VALGRIND_DO_LEAK_CHECK; 

(IIRC爲Valgrind是與--show可達的運行會過,只要表現出可達內存= YES

+0

謝謝 - 看起來非常有用,特別是VALGRIND_DO_ADDED_LEAK_CHECK。如果我可以將輸出結果輸出到一個文件中,情況會更好,但是我會捅一捅。 – abligh

+0

你總是可以將stdout/stderr重定向到一個文件,並且我確定gdb有一些命令可以將輸出保存到一個文件中。 – nos

+0

我還沒有嘗試過,但我認爲* programatic *調用會出現在目標的STDERR上嗎?在這種情況下,它指向'/ dev/null'(這是一個守護進程)。無論如何,這是一個微不足道的問題。 – abligh

1

還有的Valgrind Massif工具,可以顯示您的應用程序的一般內存使用情況,不只是爲泄漏的內存。它通過調用函數及其回溯分解了malloc() s和free() s,所以您可以看到哪些函數在不釋放的情況下繼續分配內存。這可能是查找您提到的類型泄漏的極好工具。

不幸的是,Massif附近的工具有點奇怪... Valgrind提供的ms_print工具僅用於最基本的任務;對於真正的工作,你可能想要顯示圖形的東西。網絡周圍有幾種工具可以使用 - 例如參見。 Valgrind Massif tool output graphical interface?

+0

謝謝 - 也很有用。 – abligh