2011-06-28 56 views
1

我的應用程序崩潰(重複)後,我從VS2005轉移到VS2008(win32)中。如何調試/修復訪問衝突(堆損壞)

如果我在調試步驟,我得到:

Access violation reading location 0x00000014 

首先,我看到在崩潰行類對象,有一個NULL _vptr。但同一類的其他一些物品具有非空_vprt :)

其次,如果我改變的成員對象的聲明,墜毀移動到其他一些線路的順序。

所以我想這一定是一個腐敗的堆問題。

你同意嗎?如果是的話,堆棧中的分配數量如「char buffer [8192]」是否會成爲問題?

我試過purify,申請驗證沒有運氣。我的應用程序是一個生活在專有應用程序中的插件(dll)。我只能附加一個調試器。提前

感謝,

保羅

+0

你鏈接到你不控制的C++庫嗎?如果他們編譯爲VS2005,他們可能會在VS2008中正確工作。 –

回答

0

事實證明,這是與預處理器的一個問題是定義我的應用程序和它的一些依賴關係(庫)之間是不同的。

3

你同意嗎?如果是的話,堆棧中的分配數量如char buffer[8192]會成爲問題嗎?

是,堆損壞可以通過在堆中分配的巨大尺寸的陣列引起的(通過使用新的或malloc的)。如果您在堆棧上創建大型數組,如果相鄰內存分配給另一個對象,程序將覆蓋該對象的數據,導致崩潰。所以這兩者都可能是危險的,但由於不同的問題。如果你正在談論一個堆棧數組,那麼它不會因爲堆棧或堆(而非C++中的自由存儲)是兩個不同的內存實體而導致堆損壞。

堆損壞可以是非常令人沮喪和難以診斷。儘管可以嘗試調試這些錯誤的方法有很多,但還沒有確定的步驟來解決這樣的問題。

Debugging Heap Corruption in Visual C++ Using Microsoft Debugging Tools for Windows是文檔特定於Visual C++

+0

8192字節是否算作巨大尺寸? – Paul

+0

@保羅:是的。檢查我發佈爲鏈接的文檔,這是要走的路。 –

+1

@Als,假設我笨拙了一會兒,但是大堆分配('char buffer [8192]')與堆損壞有什麼關係? –

1

這明確看起來像一個堆損壞技術的極好來源 - 在某些時候,你的代碼寫零的物體的頂部,並殺死的vptr 。從VS2005移植到VS2008後發生的原因可能是因爲堆佈局有所改變。這個bug也可能在VS2005中出現,但它的傷害沒有被注意到。

使用您提到的工具通常可以解決此類問題。使用它們時你有什麼不幸?

既然你說你的應用程序重複崩潰以相同的方式,你可以在你的代碼中添加檢查。連續驗證損壞的物體(確保它的開始沒有歸零),並在觀察到損壞時斷開。查看最新的成功驗證和休息之間的活動將有助於您專注。請記住,堆使用情況的任何更改都可能會隱藏問題,即腐蝕其他某個位置。