Microsoft 고유의 예외 처리 메커니즘

Microsoft-specific exception handling mechanisms

Microsoft Windows 시리즈 운영 체제에서는 몇 가지 특정 예외 처리 메커니즘을 사용합니다.

구조화된 예외 처리

Microsoft Structured Exception Handling은 Windows의 네이티브 예외 처리 메커니즘이며 VEVE([1]Vectored Exception Handling)의 선구자 기술입니다.이 제품은finally메커니즘은 표준 C++ 예외에는 존재하지 않습니다(다만 나중에 도입된 대부분의 명령어 언어에는 존재합니다).SEH는 실행 스레드별로 개별적으로 설정 및 처리됩니다.

사용.

Microsoft는 컴파일러 수준의 프로그래밍 기술로서만 SEH를 지원합니다.MS Visual C++ 컴파일러에는, 다음의 3개의 비표준 키워드가 있습니다.__try,__except그리고.__finally- 이 목적을 위해.기타 예외 처리 측면은 다음과 같은 많은 Win32 API [2]함수에 의해 지원됩니다.RaiseExceptionSEH 예외를 수동으로 발생시킵니다.

실행

IA-32

Windows IA-32 Edition 또는 x86-64 버전용 WoW64 에뮬레이션레이어의 각 실행 스레드에는 문서화되어 있지 않은 링크가 있습니다. 스레드 정보 블록의 선두에 있는 _EXCEPTION_RECTION_RECORDLIST.__try스테이트먼트는 본질적으로 컴파일러 정의의EH_prolog 기능.이 함수는 스택에 _EXCEPTION_REGISTRATION_RECORD를 할당합니다.__except_handler3[a] 에서 기능하다.msvcrt.dll그러면 레코드가 목록 선두에 추가됩니다.[b]마지막에는__try 컴파일러 정의 블록EH_epilog역연산을 하는 함수를 호출합니다.이러한 컴파일러 정의 루틴 중 하나는 인라인일 수 있습니다.모든 프로그래머 정의__except그리고.__finally블록은 내부에서 호출됩니다.__except_handler3프로그래머 정의 블록이 존재하는 경우 에 의해 작성된_EXCEPTION_REGISTRATION_RECORDEH_prolog는 에서 사용되는 몇 개의 추가 필드를 사용하여 확장됩니다.__except_handler3를 클릭합니다.[3]

사용자 모드 코드의 예외의 경우 운영시스템은[c] 스레드의 _EXCEPTION_REGISTRATION_RECORD 목록을 해석하고 핸들러가 예외를 처리했음을(반환값으로) 신호하거나 목록이 모두 사용될 때까지 각 예외 핸들러를 차례로 호출합니다.리스트의 마지막은 항상kernel32!UnhandledExceptionFilterGeneral protection fault 오류 [d]메시지가 표시됩니다.그런 다음 목록을 다시 한 번 통과하면 핸들러가 사용된 리소스를 정리할 수 있습니다.마지막으로 프로세스가 재개되거나 종료되는 커널[e] 모드로 돌아갑니다.

이 모드의 SEH US5628016 특허는 2014년에 만료되었습니다.

x86-64

64비트 Windows 에서의 SEH 에는 런타임 예외 핸들러 리스트는 포함되지 않습니다.대신 스택 언바인딩 테이블을 사용합니다( ).UNWIND_INFO예외 발생 [4][5]시 시스템에 의해 해석됩니다.이는 컴파일러가 수동으로 스택 언바인딩을 수행하고 예외 핸들러를 적절하게 호출하기 위해 추가 코드를 생성할 필요가 없음을 의미합니다.스택 프레임레이아웃 및 지정된 예외 핸들러에 대한 테이블 언바인드 형식으로 정보를 전송하기만 하면 됩니다.

지지하다

Mingw-w64의 GCC 4.8+에서는 C++ 예외에 대해 64비트 SEH 사용이 지원됩니다.LLVM Clang 지원__tryx86과 [6]x64의 양쪽 모두에서.

벡터된 예외 처리

Vectored Exception Handling은 Windows [7]XP에서 도입되었습니다.벡터 예외 처리는 C++Visual Basic 등의 언어를 사용하는 Windows 프로그래머가 사용할 수 있습니다.VEH는 Structured Exception Handling(SEH; 구조화 예외 처리)을 대체하는 것이 아니라 VEH와 SEH가 공존하며 VEH 핸들러가 SEH [1][7]핸들러보다 우선합니다.SEH에 비해 VEH는 커널에서 전달되는 Unix 신호에 [8]더 가깝습니다.

메모들

  1. ^ 이름은 VC 런타임 버전에 따라 다릅니다.
  2. ^ ntdll.dll그리고.kernel32.dllVC 런타임에 스태틱하게 링크된 다른 프로그램과 함께 이 함수를 컴파일합니다.
  3. ^ 좀 더 구체적으로 말하면ntdll!RtlDispatchException호출된 시스템 루틴ntdll!KiUserExceptionDispatcher이것은 차례로 에서 호출됩니다.nt!KiDispatchException커널 함수(을 참조해 주세요.Ken Johnson (November 16, 2007). "A catalog of NTDLL kernel mode to user mode callbacks, part 2: KiUserExceptionDispatcher". 상세)
  4. ^ 프로세스의 오류 모드를 변경하여 메시지를 무음화할 수 있습니다.기본 마지막 핸들러는 SetUnhandledExceptionFilter API로 대체할 수 있습니다.
  5. ^ ntdll!KiUserExceptionDispatcher어느 쪽인가에 대해서nt!ZwContinue또는nt!ZwRaiseException

레퍼런스

  1. ^ a b "Vectored Exception Handling in Windows Server 2003 (Through Internet Archive)". Archived from the original on 2008-01-18.
  2. ^ Microsoft Corp. (2009-11-12). "Structured Exception Handling Functions". MSDN Library. Retrieved 2009-11-17.
  3. ^ 컴파일러 기반의 구조화된 예외 처리Peter Kleissner (February 14, 2009). "Windows Exception Handling - Peter Kleissner". Archived from the original on October 14, 2013. Retrieved 2009-11-21. 섹션
  4. ^ "Exceptional Behavior - x64 Structured Exception Handling". The NT Insider.
  5. ^ "x64 exception handling". VC++ 2019 documentation.
  6. ^ "MSVC compatibility". Clang 11 documentation.
  7. ^ a b "Under the Hood: New Vectored Exception Handling in Windows XP". Archived from the original on 2008-09-15.
  8. ^ "Windows Server 2003 Discover Improved System Info, New Kernel, Debugging, Security, and UI APIs". Archived from the original on 2008-05-05.

외부 링크