Windows異常處理學習

2022-07-20 03:06:13 字數 1892 閱讀 5693

一、處理過程

ntdll中的kidispatchexception函式會按兩次處理機會進行分發,過程:

如果程式正在被除錯,那麼將異常交給使用者偵錯程式處理,如果沒有則跳過這一步;

如果沒有偵錯程式或者偵錯程式沒有處理,將控制權返回到kiuserexceptiondispatcher函式,由它呼叫rtldispatchexception函式進行使用者態異常處理(seh和veh)。

二、什麼是異常?

異常分為

軟體異常:程式模擬的異常,由作業系統或開發人員觸發。

硬體異常:由cpu產生,例如除0操作引發的異常。

注:異常的另一種分類法:錯誤(指令未執行)、陷阱(指令執行完畢)、和中止(發生嚴重錯誤,強迫中止)。int n指令導致的是異常而不是中斷。有些編譯器會用0xcc來使**段進行記憶體對齊。

int 3 和 int n(n = 3)是不同的:前者指令只佔乙個位元組(0xcc),後者兩個位元組(0xcd 後跟乙個位元組n)。編譯器遇到int 3會編譯為0xcc而不是0xcd03。0xcd03不應該出現在彙編中,因為他會被解析為int 3。而該指令執行後eip+1繼續執行,而0xcd03是兩個位元組,會導致eip指向錯誤,錯誤解析之後的機器碼。

向量化異常處理veh:面向整個程序,通過addvectoredexceptionhandler來設定,優先呼叫,第一輪異常分發中處理。

結構化異常處理seh:面向執行緒,seh鏈儲存在程序的資料結構中teb。作業系統根據seh鏈的順序分發異常(前提是沒有註冊veh,veh是全域性的,而seh是區域性的,veh優先順序更高),根據上一次分發的結果決定下一步操作,第一輪異常分發中處理。

uef未處理異常過濾:面向整個程序,第二輪異常分發中處理。在使用者**範圍內發生或觸發的但使用者**沒有處理的異常。

異常處理模型--try{}except( filter){}模型:對於同乙個函式的try塊都只構造一次異常棧幀,try塊中過濾函式和異常處理函式都被存放在乙個**裡。

windows作業系統異常處理過程

注:如果是手工註冊,executehandler2直接呼叫使用者註冊的函式,而不是編譯器的_except_handler4函式處理。context結構中儲存了執行環境中暫存器的值。

kernel32.dll中有函式unhandledexceptionfilter,不同版本的windows有所不同。xp中,它會首先檢測是否被除錯,然後決定把異常交給偵錯程式或是使用者設定的unhandledexceptionfilter函式。

三、異常分發機制

當異常發生時,cpu會通過idt表找到異常處理函式,即核心中的kitrapxx系列函式,然後轉去執行。但是kitrapxx函式通常只是對異常作簡單的表徵和描述,為了支援除錯和軟體自己定義的異常處理函式,系統需要將異常分發給偵錯程式或應用的處理函式。

每個異常最多兩輪被處理的機會。

對於第一輪分發,作業系統會把異常分發給使用者**註冊的異常處理函式;

對於第二輪分發,異常分發函式會先嘗試分發給偵錯程式,如果沒有偵錯程式或偵錯程式不處理,就會分發給uef來處理。

注:系統只有在第一輪分發時,才會把異常分發給使用者**註冊的異常處理器,第二輪分發時不會怎麼做。因此,seh或veh只有一輪處理異常的機會。進入第二輪分發的異常都是未處理異常。分發異常時,系統從最晚註冊的異常處理器來查詢,所以這個最早註冊的seh處理器是最後得到處理機會。

long unhandledexceptionfilter(*exinfo)
補:

異常觸發過程

異常處理學習

1 異常的使用場合 1 應用程式 2 庫 最好不要捕獲異常,除非某個異常表示的是 可以處理的情況 但要假定呼叫 可以處理他們。2 net 執行時可以把整個程式放在另乙個更大的 try塊中,如果發生的異常 沒有處理,程式流就會退出程式,由 net 執行時中的 catch 塊捕獲它。會導致程式執行中斷,...

異常處理學習筆記

arm處理器的工作模式 使用者模式user 快速中斷模式fiq 處部中斷模式irq 特權模式supervisor 資料訪問中止模式abort 未定義指令中止模式undefined 系統模式system 1一上電,cpu處於 supervisor svc 管理模式 2發生中斷,cpu進入 riq 外部...

異常處理學習筆記

arm處理器的工作模式 使用者模式 user 快速中斷模式 fiq 處部中斷模式 irq 特權模式supervisor 資料訪問中止模式 abort 未定義指令中止模式 undefined 系統模式 system 1 一上電,cpu處於 supervisor svc 管理模式 2 發生中斷,cpu進...