簡體   English   中英

檢測退出時釋放的C內存“泄漏”

[英]Detect C memory 'leaks' that are freed on exit

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

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

我可以通過generate-core-filegdb可靠地獲得一個漂亮的大型“核心” generate-core-file ; 有沒有辦法分析離線,如果說我用一個方便的malloc()調試庫編譯了malloc()

我有完全訪問源,可以修改它,但我真的不想手動檢測每個數據結構,而且我對問題的一般解決方案感興趣(如valgrind提供)而不是如何解決這個特殊問題。

我在這里尋找類似的問題,但它們似乎都是:

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

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

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

使用--vgdb = yes標志運行valgrind,然后運行命令:

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

有關詳細信息,請參閱文檔, 此處此處

您也可以在程序中編程方式執行此操作

#include <valgrind/memcheck.h>

並在代碼中的適當位置執行:

 VALGRIND_DO_LEAK_CHECK;

(只要valgrind與--show-reachable = yes一起運行,iirc也會顯示可達內存

Valgrind Massif工具顯示了應用程序的一般內存使用情況,而不僅僅是泄漏的內存。 它通過調用函數及其回溯來分解malloc()free() ,因此您可以看到哪些函數在不釋放內存的情況下繼續分配內存。 這可以成為查找您提到的類型泄漏的絕佳工具。

不幸的是,圍繞Massif的工具ms_print ...... Valgrind提供的ms_print工具僅對最基本的任務有用; 對於實際工作,你可能想要一些顯示圖形的東西。 網上散布着幾種工具 - 參見例如。 Valgrind Massif工具輸出圖形界面?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM