2011-10-05 32 views
1

我一直在努力檢測我們產品中的內存損壞錯誤。像valgrind這樣的內存檢測工具只會在崩潰時告訴問題,而不是實際發生損壞的時間。我已經看到,在使用調試版本時,它將在塊被釋放之前和之後檢查內存區域,並顯示調試斷言失敗,說明發生了堆損壞。那麼我可以在調試模式下重建我的產品以在發生錯誤時捕獲錯誤嗎?它是否也會捕獲緩衝區溢出等?我無法在互聯網上找到任何有關調試版本的信息,這些信息是針對內存錯誤檢測的。Visual C++調試版本是否識別堆損壞錯誤?

+0

我們的操作系統是什麼? – masebase

+0

Windows。我正在使用visual C++ –

回答

0

「C++」不是編譯器;供應商根據標準規格制定自己的(或多或少)。我可以告訴你,它通過在每個newmalloc塊周圍分配「哨兵」(當然僅在調試模式下)並用特殊模式填充它們(已被0xCD當我上次使用它),然後它檢查守衛圍繞該位置的每個寫入。如果他們改變了,你會得到一個運行時錯誤,說堆已損壞。

順便說一下,緩衝區溢出堆損壞。

編輯添加引用:http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx

1

您可以在每個版本的Windows使用,以及在「頁堆」可用。 您可以使用隨Windows調試工具提供的gflags爲您的應用程序配置完整頁面堆。 然後,您可以在調試器下運行應用程序,即使在零售模式下也是如此。一旦遇到緩衝區溢出或訪問釋放的內存,調試器將停止。

我非常喜歡這個工具,因爲它是在OS中構建的,甚至可以在客戶站點激活(gflags只設置註冊表項,您可以簡單地將這些密鑰發送給您的客戶)。當我們提到(Windows調試工具)時,有些人會害怕。您可以使用Visual Studio來診斷問題。您需要的唯一東西是與您的二進制文件相對應的PDB(即使對於發佈版本,您也可以生成它們)。

+0

那麼頁面堆機制就像調試版本一樣好?我的印象是,它只會在應用程序崩潰時創建一個核心轉儲文件(而不是在腐敗發生時預先提供)。 –

+0

「全頁堆」嘗試在發生時檢測到損壞。在極少數情況下,它只能在稍後檢測到。如果您沒有附加調試器,它將生成轉儲。但是,如果您有調試器,WinDbg或Visual Studio,它將立即中斷。然後,您可以查看程序狀態,並從調用堆棧中找出崩潰的原因。您可以在發佈模式下執行此操作。但是,爲了便於調試,可以在編譯階段關閉優化。試試頁堆,我相信你會喜歡它的! –