[英]Detect C memory 'leaks' that are freed on exit
假設我有一個C程序(在Linux下運行),它操作許多數據結構,一些復雜,其中一些可以增長和縮小,但通常不會隨着時間的推移而增長。 觀察到該程序隨着時間的推移逐漸增加RSS(比可以通過內存碎片解釋的更多)。 我想找到泄漏的東西。 在valgrind
下運行是一個明顯的建議,但是valgrind
(使用--leak-check=full
和--show-reachables=yes
)顯示沒有泄漏。 我相信這是因為數據結構本身在退出時正確釋放,但其中一個在程序的生命周期中正在增長。 例如,可能有一個鏈接列表隨着時間的推移呈線性增長,有人忘記刪除列表中的資源,但退出清理正確地在退出時釋放列表中的所有項目。 當然,如果它們被釋放,那么它們是否實際上是“泄漏”存在一個哲學問題(因此問題中的引號)。
是否有任何有用的工具來檢測這個? 我喜歡的是能夠在valgrind
下運行並讓它產生當前分配的報告,就像它在退出時一樣,但要在信號上發生這種情況並允許程序繼續。 然后,我可以查找堆棧跟蹤簽名對它們的分配越來越多。
我可以通過generate-core-file
從gdb
可靠地獲得一個漂亮的大型“核心” 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.