C++性能系列之SEH(Win32結構化異常處理)簡介

Win32 結構化異常處理其核心是操作系統提供的服務,你能找到的關於 SEH 的所有文檔都是描述一個特定的編譯器運行時庫,這個運行庫包裝着操作系統實現。在本文中,我將一層一層對 SEH 進行剝離,以便展現其最基本的概念。

在 Win32 操作系統提供的所有功能中,使用最廣泛但最缺乏文檔描述的也許就是結構化異常處理了(SEH),當你考慮Win32 結構化異常處理時,你也許會想到諸如 _try,_finally 以及 _except 這些術語。你能在任何有關 Win32 的書中發現對SEH 很好的描述(即使是 remedial)。即便是 Win32 SDK 也具備有相當完整的使用 _try,_finally 和 _except 進行結構化異常處理的概述。

有了這些文檔,那爲何還說 SEH 缺乏文檔呢?其實,Win32 結構化異常處理是操作系統提供的一個服務。你能找到的關於SEH 的所有文檔都是描述特定編譯器的運行時庫,這個運行庫對操作系統實現進行包裝。_try,_finally 和 _except 這些關鍵字沒有任何神奇的地方。微軟的操作系統及其編譯器系列定義這些關鍵字和用法。其他的編譯器提供商則只是沿用這些語義。雖然藉助編譯器層的 SEH 可以挽回一些原始操作系統級 SEH 處理不良口碑,但在大衆眼裏對原始操作系統 SEH 細節的處理感覺依舊。

我收到人們大量的e-mail,都是想要實現編譯器級的 SEH 處理,又無法找到操作系統功能提供的相關文檔。通常我都是建議參考 Visual C++ 或者 Borland C++ 運行庫源代碼。唉,出於一些未知的原因,編譯器級的 SEH 似乎是一個大的祕密,微軟和 Borland 都不提供其對 SEH 支持的核心層源代碼。

在本文中,我將一層一層對 SEH 進行解剖,以便展現其最基本的概念。我打算通過代碼產生和運行時庫支持將操作系統提供的功能和編譯器提供的功能分開。當我深入代碼考察關鍵的操作系統例程時,我將使用 Intel 平臺上的 Windows NT6.2作爲基礎。但我將要描述的大多數內容同樣適用於其它處理器上運行的應用。

我打算避免涉及到真正的 C++ 異常處理,它們使用 catch(),而不是 _except。其實,真正的 C++ 異常處理實現非常類似於本文中描述的內容。但是 C++ 異常處理有一些額外的複雜性會影響我想要涉及的概念。

通過深入研究晦澀的 .H 和 .INC 文件來歸納 Win32 SEH 構成,我發現有一個信息源之一就是 IBM OS/2 頭文件(尤其是BSEXCPT.H)。爲此你不要覺得大驚小怪。。此處描述的 SEH 機制在其源頭被定義時,微軟仍然開發 OS/2 平臺(譯註:OS/2 平臺起初是IBM 和 微軟共同研發的,後來由於種種原因兩個公司沒有再繼續下去)。所以你會發現Win32 下的 SEH 和OS/2 下的 SEH 極其相似。

發佈了115 篇原創文章 · 獲贊 176 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章