마이크로소프트의 예외 처리 메커니즘

마이크로소프트 윈도우 운영 체제는 운영 체제 특성에 기반한 예외 처리 메커니즘을 사용한다.

 구조화된 예외 처리 (SEH : Structured Exception Handling) 
마이크로소프트 구조화된 예외 처리 (Microsoft Structured Exception Handling)는 윈도우를 위한 네이티브 예외 처리 메커니즘이며 VEH의 전신이다. 이것은 표준 C++ 예외에는 존재하지 않는 finally 메커니즘을 특징으로 갖는다(그러나 대부분의 명령형 프로그래밍 언어들에서는 이후 소개되었다). SEH는 실행의 각 스레드를 위해 독립적으로 설치되고 처리된다.

SEH의 마이크로소프트 구현은 볼랜드,  라이선스의 특허권에 기반한다. 오픈소스 운영 체제 시스템들은 이 특허권 때문에 SEH 기반 메커니즘을 채택하는 것을 꺼린다.

 사용 
마이크로소프트는 SEH를 단지 컴파일러 수준에서의 프로그래밍 기법으로 지원한다. MS 비주얼 C++ 컴파일러는 이 목적을 위해 세개의 표준화되지 않은 키워드: __try, __except 그리고 __finally 라는 특징을 갖는다. 다른 예외 처리 측면들은 수많은 윈도우 API 함수들의 지원을 받는다. 예를 들면 SEH 예외를 직접 일으키기 위한 RaiseException가 있다.

 구현 
윈도우에서 실행의 각 스레드는 자신의 스레드 정보 블록의 시작에서 문서화되지 않은 _EXCEPTION_REGISTRATION_RECORD 리스트와의 연결을 갖는다. __try 선언은 근본적으로 컴파일러에서 정의된 EH_prolog 함수를 호출한다. 이 함수는 스택에서 _EXCEPTION_REGISTRATION_RECORD를 할당하며, 이것은 msvcrt.dll에서 __except_handler3 함수를 가리키고, 리스트의 헤드에 레코드를 추가한다. __try 블록의 끝에서 컴파일러에서 정의된 역 연산을 수행하는 EH_epilog 함수가 호출된다. 이 컴파일러에서 정의된 루틴들은 인라인화될 수 있다. 모든 프로그래머가 정의한 __except 와 __finally 블록들은 __except_handler3 내부에서 호출된다. 만약 이러한 블록들이 존재한다면 생성된 _EXCEPTION_REGISTRATION_RECORD는 소수의 추가적인 필드들로 확장되며, 이것은 __except_handler3에 의해 사용된다.

사용자 모드 코드에서의 예외의 경우, 운영 체제는  핸들러 신호가 예외를 처리하거나 리스트가 끝날 때까지 스레드의 _EXCEPTION_REGISTRATION_RECORD 리스트를 분석하고 순서에 따라 각 예외 처리기를 호출한다. 리스트의 마지막은 항상 일반 보호 장애를 표시하는 kernel32!UnhandledExceptionFilter이다. 그 후 리스트는 처리기에게 사용된 자원들을 청소할 기회를 주며 한번 더 순회된다. 마지막으로 실행은 커널 모드로 반환되는데 여기는 프로세스가 재개되거나 종료되는 곳이다.

 벡터화된 예외 처리 (VEH :Vectored Exception Handling) 
벡터화된 예외 처리(Vectored Exception Handling)는 윈도우 XP에서 도입되었다. VEH는 C++과 비주얼 베이직 같은 언어를 사용하는 윈도우 프로그래머에게 사용 가능하게 만들어졌다. VEH는 SEH를 대체하는 것이 아니라 VEH가 SEH보다 더 높은 우선 순위를 가짐으로써 공존한다. SEH와 비교해서, VEH는 더 전통적인 알림 콜백 스킴과 닮았다.

 노트 

 각주 

 외부 링크 

  Note that the examples given there do not work as-is on modern Windows systems (post XP SP2) due to the changes Microsoft made to address the security issues present in the early SEH design. The examples still work on later versions of Windows if compiled with /link /safeseh:no.


  Covers the obscure details needed to get low-level SEH (and particularly SafeSEH) code to work on more modern Windows.



  An article explaining why Windows 7 SP1 ignores SafeSEH for some older binaries, while Windows XP SP3 honors it.

분류:제어 흐름
분류:마이크로소프트 API