2013-06-05 60 views
1

如何處理這個異常?如何處理這個異常? (零esp)

__asm 
{ 
    mov esp, 0 
    mov eax, 0 
    div eax 
} 

這不是try/exceptSetUnhandledExceptionFilter()處理。

+2

結束了,您不能用非功能性堆棧執行任何代碼。 –

+0

在UNIX上,至少可以檢測/攔截它。您可以請求信號處理程序在專用堆棧上運行,有關詳細信息,請參閱http://stackoverflow.com/questions/5785746/how-to-use-sigaltstack-in-signal-handler-program。所有這些事情的問題是,「當你說'處理'這個時,你有什麼特別的意思?」 –

回答

4

假設這是在操作系統中運行,操作系統將捕獲除以零,然後ATTEMPT爲應用程序代碼形成異常/信號堆棧幀。但是,由於用戶模式堆棧「不好」,所以不能。

除了殺死應用程序之外,操作系統根本無法處理這個問題。 [理論上講,它可以由一些動態分配的內存組成一個新的堆棧,但是它沒有意義,因爲沒有(總是有效的)應用程序本身恢復到理智狀態的方式。

不要將堆棧指針設置爲不是堆棧的東西 - 或者如果確實將「隨機」數據存儲在堆棧指針寄存器中,則不會有例外。這與「不要把槍對準你的腳並拉動扳機,除非你想要沒有你的腳」。

編輯:

如果代碼中的「內核模式」,而不是「用戶模式」運行,它更「GAME OVER」,因爲這將「雙誤」 - 處理器通過零擊中鴻溝嘗試寫入堆棧的異常處理程序,以及何時執行它,它會發生故障。這現在是「故障處理程序中的故障」,又稱爲「雙重故障」。雙錯處理程序的典型設置是有一個單獨的堆棧,然後恢復故障處理程序。但它仍然是遊戲結束 - 我們不知道如何返回到原始錯誤處理程序[或如何找出原始錯誤處理程序是什麼]。

如果雙重故障處理程序沒有「新堆棧」,則會使x86處理器出現三倍故障 - 通常情況下,三重故障會使處理器重新啓動[技術上,它會通過特定的位組合來暫停處理器在地址總線上表明這是一個「三重故障」。典型的PC北橋然後重置處理器,以認識到三重故障是不可恢復的情況 - 這就是爲什麼有時您的PC只是在質量差的驅動器時重新啓動]。

+0

感謝您的回答 – oep

+0

在UNIX中,它對用戶態應用程序來說是可能的。不是通過C/C++「內建設施」(所以'try' /'catch'之類,不行,OS /硬件「例外」與C++語言級別的例外不同),而是通過'sigaltstack() '。這允許應用程序告訴操作系統「是否發生信號,在這個其他堆棧上運行信號處理程序」。請參閱http://pubs.opengroup.org/onlinepubs/009695399/functions/sigaltstack.html –

+0

然而,在這一點上,您仍然不太可能繼續。例如,'longjump()'可能回到代碼之前的某一點,但它幾乎可以肯定「你現在必須停下來......) –

1

嘗試與嵌入程序集中的更高級別語言的異常機制進行交互並不是一個好主意。編譯器可以做到你無法匹配的「魔力」,並且沒有(可移植的)方式告訴編譯器「這個彙編代碼可能會拋出異常」。

+0

我該如何處理這個異常? – oep

+0

我99%確定沒有什麼可以做的。你真正想要解決什麼問題(這有一個XY問題的感覺)。 –

+0

我正在寫一個簡單的程序來模擬惡意軟件,並想處理異常與CPU ,,,與這個問題,我沒有CPU CPU異常 – oep