2009-07-24 65 views

回答

7

我不是太熟悉的調試堆和STL檢查,但是當我有記憶問題在GCC在Linux上我使用名爲MALLOC_CHECK_(通過malloc(3))環境變量:

最近Linux libc(晚於5.4.23)和GNU libc(2.x)的版本包括一個 malloc實現,它可以通過環境變量進行調整。當 MALLOC_CHECK_被設置時,使用一個特殊的(效率較低的)實現,其被設計爲容忍簡單錯誤,例如具有相同參數的free() 的雙重調用,或者單個字節的溢出(off-by - 一個錯誤)。然而,並不是所有的 這樣的錯誤都可以被保護,並且可能導致內存泄漏。如果 MALLOC_CHECK_設置爲0,則任何檢測到的堆損壞都會被忽略;如果 設置爲1,診斷打印在stderr上;如果設置爲2,則立即將abort()稱爲 。這可能很有用,因爲否則後面的崩潰可能會發生很多,並且問題的真正原因很難追查到。

還有電籬笆,可以幫助趕上超限/欠載發生緩衝超限中止。有關更多信息,請參見libefence(3)

3

標準庫的STLport版本http://sourceforge.net/projects/stlport/有一個調試模式,我曾經使用過,這是Scott Meyers在Effective STL中推薦的。但是現在我已經使用了好幾年了,所以我不能保證目前的狀態。

還有一個關於GCC STL調試的線程here,但我再次無法保證它給出的信息。

+0

謝謝尼爾。我真的不希望替換STL,因爲我使用用「標準」STL構建的第三方庫。 – rpg 2009-07-24 13:00:51

+1

不幸的是,你將不得不使用一組不同的STL容器,即使你使用來自同一供應商爲你經常庫附帶一個庫實現以獲取調試STL的支持。我很肯定,如果你使用的是調試版本,那麼對象不會改變它們的佈局,那麼沒有真正的'調試STL'。所以恕我直言,你將不得不去使用相同版本的庫和相同的標誌重建所有組件。 – 2009-07-24 13:08:02

+0

據我所知,默認情況下,MSVC具有調試STL功能,因此使用STL的庫的調試版本將使用調試功能(假設它們沒有明確關閉它們 - 這會使庫不兼容與默認的MSVC項目)。 我可以做出努力並重建,但如果可能的話,我仍然希望使用經典的STL。 – rpg 2009-07-24 13:25:40

2

我從來沒有使用過它們,但我知道glibc具有一些用於動態分配內存調試的功能。這裏有一個相關的手冊條目http://www.gnu.org/s/libc/manual/html_node/Memory-Allocation.html#Memory-Allocation。 「Unconstrained Allocation」有一些關於分配函數掛鉤的方法,「Allocation Debugging」包含一些關於glibc跟蹤分配的能力的信息。

就我個人而言,我認爲Valgrind是最簡單的方法。

3

一些堆調試提供與您要查找的內容可以包括任何標準庫之前定義_GLIBCXX_DEBUG啓用用efence /杜馬(議會下連MinGW的)

2

。如果不能一致使用,我不確定會對此產生什麼影響。我的默認建議是要非常小心。另外我聽說調試檢查可能是一個很大的性能問題。這麼大以至於總是讓它啓用調試版本可能是不明智的。