에피소드
보관된 예외 C000027B
보관된 예외는 UWP 애플리케이션에서 만든 예외의 유형입니다. WinRT API(현재 UWP라고 함)의 일부로 Windows 8.0에서 도입되었습니다.
예외 코드가 0xC000027B.
첫 번째 예외 매개 변수(0)는 STOWED_EXCEPTION_INFORMATION_HEADER 구조체로 시작하는 구조체에 대한 포인터 배열의 시작 주소입니다. Windows 8.1 부터 STOWED_EXCEPTION_INFORMATION_V2 사용 중인 버전입니다.
두 번째 예외 매개 변수(1)는 배열의 포인터 수입니다.
보관된 예외가 실패 지점 예외(0xC000027C)로 대체/향상되었습니다. POF 예외와 마찬가지로 예외 코드는 WinRT 프레임워크에서 생성됩니다. 사용할 수 있도록 애플리케이션을 다시 컴파일할 필요가 없습니다.
비동기 작업이 실패하면 Stowed 예외가 발생합니다. RoOriginateException 또는 RoOriginateLanguageException 호출을 통해 작업자 스레드에서 예외가 보고되면 CaptureStackBackTrace 함수 호출을 통해 Stack Backtrace(명령 포인터 배열)가 현재 스레드를 수집합니다. 예외의 Stack Backtrace 및 HRESULT는 IRestrictedErrorInfo 개체에 래핑되고 WinRT의 언어 프로젝션 계층을 통해 호출자에게 라우팅됩니다.
호출자가 예외를 처리하지 않으면 보관된 예외가 치명적으로 throw됩니다. throw가 지연되므로 연결된 덤프의 현재 컨텍스트에는 값이 거의 없습니다. 원래 문제의 스레드는 더 이상 존재하지 않으며, 스레드가 있는 경우 작업을 완료했습니다(스레드의 스택 메모리를 덮어씁니다). 즉, 함수 매개 변수 및 지역 변수를 사용할 수 없습니다.
Windows용 디버깅 도구에서 이러한 문제를 디버깅할 때 다음 단계를 수행합니다.
- .exr -1
- 매개 변수를 통해 코드, 보관된 예외 배열 주소 및 개수 보기
- !pde.dse
- 보관된 예외를 나열합니다.
- 각 HRESULT가 설명되어 있습니다(!pde.err과 동일한 출력)
- 각 백트레이스는 호출 스택으로 표시됩니다.
- 각각(선택 사항) 중첩된 예외가 표시됩니다(예: CLR 예외의 !sos.pe 출력).
추가 리소스:
- 내부 - 실패 지점 예외
- 내부 - .exr
- 내부 - Windows SDK
- 조각 모음 도구 - PDE 디버거 확장 (OneDrive 링크를 통해)
- 조각 모음 도구 - #136 - 사용자 모드 크래시 덤프 디버깅 2부
- 조각 모음 도구 - #167 - 사용자 모드 크래시 덤프 Redux 디버깅
- Microsoft 설명서 - Windows용 디버깅 도구
- NTDebugging 블로그 - 1 부+ 2부
- MSDN - RoOriginateException
- MSDN - RoOriginateLanguageException
- MSDN - IRestrictedErrorInfo 인터페이스
보관된 예외는 UWP 애플리케이션에서 만든 예외의 유형입니다. WinRT API(현재 UWP라고 함)의 일부로 Windows 8.0에서 도입되었습니다.
예외 코드가 0xC000027B.
첫 번째 예외 매개 변수(0)는 STOWED_EXCEPTION_INFORMATION_HEADER 구조체로 시작하는 구조체에 대한 포인터 배열의 시작 주소입니다. Windows 8.1 부터 STOWED_EXCEPTION_INFORMATION_V2 사용 중인 버전입니다.
두 번째 예외 매개 변수(1)는 배열의 포인터 수입니다.
보관된 예외가 실패 지점 예외(0xC000027C)로 대체/향상되었습니다. POF 예외와 마찬가지로 예외 코드는 WinRT 프레임워크에서 생성됩니다. 사용할 수 있도록 애플리케이션을 다시 컴파일할 필요가 없습니다.
비동기 작업이 실패하면 Stowed 예외가 발생합니다. RoOriginateException 또는 RoOriginateLanguageException 호출을 통해 작업자 스레드에서 예외가 보고되면 CaptureStackBackTrace 함수 호출을 통해 Stack Backtrace(명령 포인터 배열)가 현재 스레드를 수집합니다. 예외의 Stack Backtrace 및 HRESULT는 IRestrictedErrorInfo 개체에 래핑되고 WinRT의 언어 프로젝션 계층을 통해 호출자에게 라우팅됩니다.
호출자가 예외를 처리하지 않으면 보관된 예외가 치명적으로 throw됩니다. throw가 지연되므로 연결된 덤프의 현재 컨텍스트에는 값이 거의 없습니다. 원래 문제의 스레드는 더 이상 존재하지 않으며, 스레드가 있는 경우 작업을 완료했습니다(스레드의 스택 메모리를 덮어씁니다). 즉, 함수 매개 변수 및 지역 변수를 사용할 수 없습니다.
Windows용 디버깅 도구에서 이러한 문제를 디버깅할 때 다음 단계를 수행합니다.
- .exr -1
- 매개 변수를 통해 코드, 보관된 예외 배열 주소 및 개수 보기
- !pde.dse
- 보관된 예외를 나열합니다.
- 각 HRESULT가 설명되어 있습니다(!pde.err과 동일한 출력)
- 각 백트레이스는 호출 스택으로 표시됩니다.
- 각각(선택 사항) 중첩된 예외가 표시됩니다(예: CLR 예외의 !sos.pe 출력).
추가 리소스:
- 내부 - 실패 지점 예외
- 내부 - .exr
- 내부 - Windows SDK
- 조각 모음 도구 - PDE 디버거 확장 (OneDrive 링크를 통해)
- 조각 모음 도구 - #136 - 사용자 모드 크래시 덤프 디버깅 2부
- 조각 모음 도구 - #167 - 사용자 모드 크래시 덤프 Redux 디버깅
- Microsoft 설명서 - Windows용 디버깅 도구
- NTDebugging 블로그 - 1 부+ 2부
- MSDN - RoOriginateException
- MSDN - RoOriginateLanguageException
- MSDN - IRestrictedErrorInfo 인터페이스
의견이 있으신가요? 여기에서 문제를 제출합니다.