디버거 예외 처리

시스템의 사용자 모드 예외 처리는 정교한 디버거를 지원합니다. 예외가 발생하는 프로세스를 디버그하는 경우 시스템은 디버그 이벤트를 생성합니다. 디버거가 WaitForDebugEvent 함수를 사용하는 경우 디버그 이벤트로 인해 해당 함수가 DEBUG_EVENT 구조체에 대한 포인터를 사용하여 반환됩니다. 이 구조에는 디버거가 스레드의 컨텍스트 레코드에 액세스하는 데 사용할 수 있는 프로세스 및 스레드 식별자가 포함됩니다. 구조체에는 예외 레코드의 복사본을 포함하는 EXCEPTION_DEBUG_INFO 구조도 포함되어 있습니다.

시스템에서 예외 처리기를 검색할 때 프로세스의 디버거에 알리기 위해 두 번의 시도를 수행합니다. 첫 번째 알림 시도는 디버거에게 중단점 또는 단일 단계 예외를 처리할 수 있는 기회를 제공합니다. 이를 첫 번째 기회 알림이라고 합니다. 그러면 사용자는 예외 처리기가 실행되기 전에 디버거 명령을 실행하여 프로세스의 환경을 조작할 수 있습니다. 디버거에 알리는 두 번째 시도는 시스템에서 예외를 처리하는 프레임 기반 예외 처리기를 찾을 수 없는 경우에만 발생합니다. 이를 마지막 기회 알림이라고 합니다. 마지막 알림 이후에 디버거가 예외를 처리하지 않으면 시스템에서 디버그 중인 프로세스를 종료합니다.

각 알림 시도에서 디버거는 ContinueDebugEvent 함수를 사용하여 제어를 시스템에 반환합니다. 컨트롤을 반환하기 전에 디버거는 예외를 처리하고 스레드 상태를 적절하게 수정하거나 예외를 처리하지 않도록 선택할 수 있습니다. ContinueDebugEvent를 사용하면 디버거가 예외를 처리했음을 나타낼 수 있습니다. 이 경우 컴퓨터 상태가 복원되고 예외가 발생한 지점에서 스레드 실행이 계속됩니다. 디버거는 예외를 처리하지 않았음을 나타낼 수도 있습니다. 이로 인해 시스템에서 예외 처리기에 대한 검색을 계속합니다.