2010-01-19 23 views
1

我正在使用MS Visual Studio 2005(C++)..未處理的異常:0x80000001:未實現。 (VC++)

任何人都可以告訴我什麼可能會導致像這樣的運行時異常..?

yyy.exe中的0x07ed0027(xxx.dll)未處理的異常:0x80000001:未實現。

xxx.dll是一個dll我工作和yyy.exe是一個exe是調用該dll ..當調試時出現未處理的異常,它將帶我到一個函數,但我不能看到函數有什麼問題(每次調用這個函數時都不會引發異常)。無論如何,我檢查了函數中的所有值,並且它們看起來沒問題。如果我單擊繼續而不是中斷,或者在休息之後按F5,那麼它就像沒有發生任何事情一樣。請讓我知道如果我沒有提供足夠的信息..

謝謝。

回答

5

像比較熟悉0000005,0x80000001是真實而引發異常的代碼。你可以在winnt.h中查找它們。在這種情況下,我發現#define STATUS_GUARD_PAGE_VIOLATION ((DWORD )0x80000001L)

防護頁面用於堆棧增長。堆棧頂部之後的第一頁被標記爲警戒頁面。當你寫信時 - 通常是通過在堆棧上推送更多數據 - 會產生一個警戒頁面異常。操作系統分配一個額外的頁面或RAM(或者可能是2個細節留給操作系統),並移動護衛頁面。

+0

謝謝,這是很好的瞭解。如果我理解正確的,什麼是不能容納在堆棧上推動更多的數據..?在我的具體情況下,它似乎不太可能,它正在打破我將void指針轉換爲結構指針的行,然後像這樣進行檢查: ... if(pToStruct-> aStructMember == NULL) 。 .. 我這裏檢查的價值觀和他們沒關係...... 謝謝.. – krebstar 2010-01-19 09:32:28

+1

這是一個另類。另一個選擇是你因爲一個錯誤而觸摸警衛頁面。例如,如果'pToStruct'指向堆棧,但堆棧中的對象實際上不具有該類型,則offsetof(aStructMember)可能太大並導致讀取未初始化的防護頁。請注意,您通常不會看到警衛頁異常,但通常您會以寫入而不是讀取開始。 – MSalters 2010-01-19 10:56:16

+0

所以你在說,也許我指定給結構指針的void指針對象可能指向一個不是所述結構並且誤讀它的對象?嗯....需要做更多的調查.. – krebstar 2010-01-20 01:53:15

1

我認爲異常過濾器可能會幫助您獲得更多詳細信息。

使用SetUnhandledExceptionFilter設置未處理的異常過濾器和檢查哪兒異常被拋出得到。

+0

謝謝,我會檢查了這一點.. – krebstar 2010-01-19 05:50:15

+0

我試圖使用它,但我似乎無法得到它的工作..我試過SetUnhandledExceptionFilter(NULL);但沒有什麼改變..我如何製作功能過濾器? – krebstar 2010-01-19 06:32:07

+0

您需要編寫一個函數並將函數名稱(函數指針)傳遞給SetUnhandledExceptionFilter。發生異常時,控件將發揮此功能。 – 2010-01-19 08:44:46