Win32結構化異常處理

SEH(Structured Exception Handling)是windows系統提供的異常處理機制。這種機制獨立於編程語言。通常情況下,開發人員不需要直接調用Win32中原始的與SEH相關的API函數,而是通過特定語言的類庫(比如MFC)間接地使用SEH,特定語言的編譯器會把他們轉換爲windows操作系統中相關API函數的調用。

SEH的思想:當某個線程在執行過程中出現異常時,它回調一個事先準備好的函數。

同一個線程可以有多個回調函數,每個回調函數負責處理一種類型的異常、這些回掉函數首尾相接構成一個鏈表,鏈表的末端是windows操作系統提供的默認處理函數。

操作系統爲每一個線程都維護一個和新對象,在覈心對象中,有一個指針指向這個異常回調函數鏈表。如下圖:

當發生異常時,操作系統找到發生異常線程的異常回調函數鏈表,然後依次調用鏈表中的每個函數,當某個函數可以處理此異常時,它向操作系統返回一個特殊的值,這時,操作系統不再調用鏈表中後面的回調函數。

如果發生異常的線程沒有定義異常回調函數鏈表,操作系統就到創建此線程的父線程中去找,最後一直追蹤到最頂層的線程(即進程中第一個線程)。

進程的第一個線程是一定有一個異常回調函數鏈表的,而且此鏈表必定至少有一個默認異常回調函數,因爲這是操作系統在啓動進程第一個線程時自動創建的。

這就意味着,如果某進程沒有定義任何的異常處理代碼,而它在執行過程中又發生了異常,那麼由默認異常回調函數來收拾殘局。默認異常回調函數完成的工作通常是兩項:

(1)詢問用戶是否調試此進程  (2)終止整個進程

如果用戶選擇調試,則用戶可以選擇將一個調試器附加到此進程進行調試,否則,操作系統講強行終止整個進程和它所創建的所有線程,並回收其資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章