首先要明白異常處理是分層的,有:
1.核心異常處理
2.偵錯程式異常處理
3.程序veh
4.執行緒seh
5.系統預設的異常處理函式 unhandledexcetionfilter().
setunhandledexceptionfilter()來註冊新的top level exception filter函式
應用程式觸發異常時,系統在前面沒有異常處理的情況下,會呼叫kernel32.dll中的unhandledexceptionfilter()函式。
unhandledexceptionfilter()函式裡會利用ntdll.dll中的ntqueryinformationprocess()來判斷是否被除錯。
若判斷在被除錯,異常給偵錯程式處理(od偵錯程式顯示無法處理異常,程序終止)。
若判斷未被除錯,則呼叫top level exception filter函式。
預設的top level exception filter 函式根據 hklm\software\microsoft\windows nt\currentversion\aedebug子鍵中的項來處理.
異常發生時,順序執行為:
cpu捕獲異常->ring0核心異常處理->ring3層偵錯程式->ring3層的異常處理 ntdll.dll中的kiuserexceptiondispatcher().
void stdcall kiuserexceptiondispatcher (exception_record *er, context *con)
注:如int 3,eflags的trap flag,在od關閉忽略異常,strongod選項不選,將不會觸發kiuserexceptiondispatcher()函式.
kiuserexceptiondispatcher執行流程(根據某一過程的返回值,來決定下一步動作)
windows 2000:
執行緒棧中單鏈表seh(unwind)->程序setunhandledexceptionfilter()註冊的函式->系統預設的異常處理top level exception filter 函式
xp異常處理順序:
程序堆中雙鏈表veh->執行緒棧中單鏈表seh(unwind)->程序setunhandledexceptionfilter()註冊的函式->系統預設的異常處理top level exception filter 函式
結合od的個人除錯經驗,若想知道整個程序的異常情況,可以在kiuserexceptiondispatcher 下條件斷點(shift+f4):
1.異常原因: [[esp]]
log data
位址 訊息
77b46fe8 cond: 異常資訊 = 80000003
77b46fe8 斷點位於 ntdll.kiuserexceptiondispatcher
77b46fe8 cond: 異常位址 = 00411c31
77b46fe8 斷點位於 ntdll.kiuserexceptiondispatcher
mfc訊息處理順序
mfc中處理訊息的順序 1.afxwndproc 接收訊息,尋找訊息所屬的 cwnd 物件,然後呼叫 afxcallwndproc 2.afxcallwndproc 儲存訊息 訊息識別符號和訊息引數 供未來參考,然後呼叫 windowproc 3.windowproc 傳送訊息給 onwndmsg ...
網路 DNS處理順序
上文中我們知道了dns到底是個什麼樣的東西,現在我們來看下dns快取,為什麼會有dns快取呢?這是為了解決頻繁的訪問dns伺服器,直接在本地進行快取伺服器ip位址的策略,這樣我們輸入乙個 網域名稱譬如 www.baidu.com,就用再到dns伺服器去獲取對應的 的ip位址,直接從本地獲取ip位址去...
Windows系統異常處理
在c 中使用try catch不能捕捉作業系統丟擲的異常,如非法位址訪問 浮點異常等,而使用vc中的擴充套件特性 try except和 try finally可以捕捉這類異常.如 int func int i except exception execute handler return i vo...