如何在 *nix 系統上追蹤/修復大型 C/C++ 程式碼中與記憶體相關的問題

如何在 *nix 系統上追蹤/修復大型 C/C++ 程式碼中與記憶體相關的問題

您在追蹤記憶體相關問題時使用什麼策略?您使用哪些工具(開源和專有)來識別記憶體洩漏、記憶體損壞等?如果系統上只有 gdb/dbx 可用,您將如何追蹤記憶體洩漏?

對我來說,僅使用調試器修復記憶體洩漏非常困難。

答案1

如果可以修改原始碼的話動態分配是很棒的;它將列出哪些指標未被釋放以及(對於使用偵錯符號建構的程式碼)它們被分配在哪一行。

如果你不能,瓦爾格林德幾乎是這類事情的標準。我通常發現 Valgrind 有點難用,但它有更多的功能,並且不涉及在程式碼中添加 dmalloc 調用

答案2

valgrind 非常有幫助。

答案3

地塊(來自 valgrind)是尋找記憶體洩漏的最佳方法之一。重複您的可疑程式碼(或執行您的程式足夠長的時間)並使用 ms_print 轉儲結果。通常,呼叫堆疊會為您提供足夠的資訊來修復它。

使用 GDB,您可以嘗試附加到正在運行的程式並呼叫諸如malloc_stats()

如果您的程式是用不同的語言編寫的,則可能會更加棘手。最近,一些 GDB 獲得了腳本化能力,人們開始了有趣的項目,例如gdb 堆,它可以從核心轉儲中分析 Python 記憶體。類似的記憶體分析腳本可能適用於 C++ 物件。

另請閱讀https://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb

答案4

我做 Objective-C 已經有一段時間了,有一個分析器可以處理 C 級記憶體管理和類似的東西。Clang 靜態分析器非常好,Apple 決定將其與 xCode IDE 捆綁在一起。我不確定這是否適合你的問題,但如果你正在做 C 那麼值得一試。

相關內容