假設我有一個C程序(在Linux下運行),它處理許多數據結構,一些複雜的數個結構可以增長和縮小,但通常不會隨着時間增長。隨着時間的推移,程序被觀察到RSS逐漸增加(比內存碎片可以解釋更多)。我想找出什麼在泄漏。運行在valgrind
這裏是明顯的建議,但valgrind
(與--leak-check=full
和--show-reachables=yes
)顯示沒有泄漏。我相信這是因爲數據結構本身在退出時正確地被釋放,但其中一個在程序生命週期中正在增長。例如,可能有一個鏈接列表隨着時間的推移正在線性增長,有人忘記刪除列表上的資源,但退出清理正確地釋放了退出時列表上的所有項目。當然,如果它們被釋放,這些實際上是否是「泄漏」(因此問題中的引號),這是一個哲學問題。檢測退出時釋放的C內存「泄漏」
是否有任何有用的工具來測試它?我最喜歡的是能夠在valgrind
下運行,並且能夠產生一個當前分配報告,就像它在退出時一樣,但是讓這種情況發生在一個信號上並允許程序繼續。然後,我可以查找堆棧跟蹤簽名對他們的增長分配情況。
我可以可靠地從gdb
與generate-core-file
得到一個很好的大'核心'文件;有沒有什麼方法可以分析脫機,如果說我編寫了一個方便的malloc()
調試庫,儀器malloc()
?
我可以完全訪問源代碼,並且可以對其進行修改,但我並不真正想手動測試每個數據結構,而且我對該問題的一般解決方案感興趣(如提供valgrind
)而不是如何解決這個特定的問題。
我看了有關此處類似的問題,但他們似乎都爲:
- 爲什麼我的程序內存泄漏?
- 如何檢測退出時的內存泄漏? (對我沒用)
- 如何檢測核心文件中的內存泄漏? (很好,但沒有一個滿意答案)
如果我在Solaris下運行,我猜測答案是'使用這個方便的dtrace
腳本'。
我是valgrind的基金,我非常確定valgrind會告訴你這些「泄漏」。如果你釋放列表項並忘記釋放列表項中的資源,這些將顯示在valgrind中,因爲「肯定丟失了」。只是不要使用'--show-reachables = yes',因爲這會隱藏我剛剛解釋的內容,因爲它實際上是無法訪問的。 – Montaldo
他只是混淆了術語。只要內存可用,它不會丟失或泄漏。請重寫問題,並避免使用「泄漏」一詞。這不是泄漏。 –
@Montaldo我對'valgrind'非常熟悉;它沒有顯示泄漏,因爲它們在退出時被釋放。 – abligh