상위 질문
타임라인
채팅
관점
마이크로소프트의 예외 처리 메커니즘
위키백과, 무료 백과사전
Remove ads
마이크로소프트 윈도우 운영 체제는 운영 체제 특성에 기반한 예외 처리 메커니즘을 사용한다.
구조화된 예외 처리 (SEH : Structured Exception Handling)
요약
관점
마이크로소프트 구조화된 예외 처리 (Microsoft Structured Exception Handling)는 윈도우를 위한 네이티브 예외 처리 메커니즘이며 VEH의 전신이다.[1] 이것은 표준 C++ 예외에는 존재하지 않는 finally
메커니즘을 특징으로 갖는다(그러나 대부분의 명령형 프로그래밍 언어들에서는 이후 소개되었다). SEH는 실행의 각 스레드를 위해 독립적으로 설치되고 처리된다.
SEH의 마이크로소프트 구현은 볼랜드, 미국 특허 5,628,016 라이선스의 특허권에 기반한다. 오픈소스 운영 체제 시스템들은 이 특허권 때문에 SEH 기반 메커니즘을 채택하는 것을 꺼린다.[2]
사용
마이크로소프트는 SEH를 단지 컴파일러 수준에서의 프로그래밍 기법으로 지원한다. MS 비주얼 C++ 컴파일러는 이 목적을 위해 세개의 표준화되지 않은 키워드: __try
, __except
그리고 __finally
라는 특징을 갖는다. 다른 예외 처리 측면들은 수많은 윈도우 API 함수들의 지원을 받는다.[3] 예를 들면 SEH 예외를 직접 일으키기 위한 RaiseException
가 있다.
구현
윈도우에서 실행의 각 스레드는 자신의 스레드 정보 블록의 시작에서 문서화되지 않은 _EXCEPTION_REGISTRATION_RECORD 리스트와의 연결을 갖는다. __try
선언은 근본적으로 컴파일러에서 정의된 EH_prolog
함수를 호출한다. 이 함수는 스택에서 _EXCEPTION_REGISTRATION_RECORD를 할당하며, 이것은 msvcrt.dll
에서 __except_handler3
함수를 가리키고,[a][b] 리스트의 헤드에 레코드를 추가한다. __try
블록의 끝에서 컴파일러에서 정의된 역 연산을 수행하는 EH_epilog
함수가 호출된다. 이 컴파일러에서 정의된 루틴들은 인라인화될 수 있다. 모든 프로그래머가 정의한 __except
와 __finally
블록들은 __except_handler3
내부에서 호출된다. 만약 이러한 블록들이 존재한다면 생성된 _EXCEPTION_REGISTRATION_RECORD는 소수의 추가적인 필드들로 확장되며, 이것은 __except_handler3
에 의해 사용된다.[4]
사용자 모드 코드에서의 예외의 경우, 운영 체제는 [c] 핸들러 신호가 예외를 처리하거나 리스트가 끝날 때까지 스레드의 _EXCEPTION_REGISTRATION_RECORD 리스트를 분석하고 순서에 따라 각 예외 처리기를 호출한다. 리스트의 마지막은 항상 일반 보호 장애를 표시하는 kernel32!
UnhandledExceptionFilter
이다.[d] 그 후 리스트는 처리기에게 사용된 자원들을 청소할 기회를 주며 한번 더 순회된다. 마지막으로 실행은 커널 모드로 반환되는데[e] 여기는 프로세스가 재개되거나 종료되는 곳이다.
Remove ads
벡터화된 예외 처리 (VEH :Vectored Exception Handling)
벡터화된 예외 처리(Vectored Exception Handling)는 윈도우 XP에서 도입되었다.[5] VEH는 C++과 비주얼 베이직 같은 언어를 사용하는 윈도우 프로그래머에게 사용 가능하게 만들어졌다. VEH는 SEH를 대체하는 것이 아니라 VEH가 SEH보다 더 높은 우선 순위를 가짐으로써 공존한다.[1][5] SEH와 비교해서, VEH는 더 전통적인 알림 콜백 스킴과 닮았다.[6]
노트
- 더 구체적으로,
ntdll!RtlDispatchException
시스템 루틴은 이후nt!KiDispatchException
커널 함수에서 호출되는ntdll!KiUserExceptionDispatcher
로부터 호출된다.(Ken Johnson (2007년 11월 16일). “A catalog of NTDLL kernel mode to user mode callbacks, part 2: KiUserExceptionDispatcher”. for details) - 이 메시지는 프로세스의 error mode를 변경함으로써 조용해진다; 기본 마지막 처리기는 SetUnhandledExceptionFilter로 대체될 수 있다.
각주
외부 링크
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads