프로파일링 API의 예외 처리
예외 알림은 설명하고 이해하기가 가장 어려운 알림입니다. 이 항목에서는 이러한 예외 처리를 설명하고 프로파일링 API에서 다양한 형식의 예외를 처리하는 방법을 설명합니다.
예외 알림 순서도
원래 예외 처리는 복잡합니다. 이 항목에서 설명하는 예외 알림은 정교한 프로파일러에서 프로파일링된 프로세스의 모든 스레드에 대해 실행되는 finally 블록, 패스(검색 단계 또는 해제 단계), 프레임, filter를 추적하는 데 필요한 모든 정보를 제공합니다. 예외 알림은 ThreadID를 제공하지 않지만 ICorProfilerInfo::GetCurrentThreadID 메서드를 호출하여 예외를 throw한 관리되는 스레드를 검색할 수 있습니다.
다음 그림에서는 예외 이벤트를 모니터링할 때 코드 프로파일러가 다양한 콜백을 받는 방법을 보여 줍니다. 정상적인 실행 상태로 각 스레드가 시작됩니다. 스레드가 예외 시스템 내부의 상태(검색 단계 또는 해제 단계)이면 예외 시스템에 의해 제어됩니다. 스레드가 이러한 상태 중 하나일 때 발생하는, 예외와 관련되지 않은 콜백(예: ICorProfilerCallback::ObjectAllocated)은 예외 시스템 자체로 인해 발생한 것일 수 있습니다. 스레드가 예외 시스템 외부의 상태이면 임의의 관리 코드가 실행됩니다.
예외 콜백 시퀀스
중첩된 예외
예외를 처리하는 동안 관리 코드 실행을 시작한 스레드는 다른 예외를 throw할 수 있는데 이렇게 되면 완전히 새로운 예외 처리 패스가 시작됩니다. 위의 그림에서 "새 예외 처리 패스"가 이 새로운 패스를 나타냅니다. 이러한 중첩된 예외가 원래 예외에서 filter/finally/catch 블록을 이스케이프하는 경우 다음과 같이 원래 예외에 영향을 미칠 수 있습니다.
filter 블록 내에 중첩된 예외가 발생하고 filter 블록을 이스케이프하는 경우 filter가 false를 반환한다고 간주되고 첫째 패스가 계속됩니다.
finally 블록 내에 중첩된 예외가 발생하고 finally 블록을 이스케이프하는 경우 원래 예외의 처리가 다시 시작되지 않습니다.
catch 블록 내에 중첩된 예외가 발생하고 catch 블록을 이스케이프하는 경우 원래 예외의 처리가 다시 시작되지 않습니다.
관리되지 않는 처리기
예외가 비관리 코드에서 처리될 수 있습니다. 이 경우 프로파일러에서는 해제 단계가 표시되지만 catch 처리기의 알림을 받지 않습니다. 비관리 코드에서 실행이 정상적으로 다시 시작됩니다. 비관리 코드를 인식하는 프로파일러에서는 이 상황을 감지할 수 있지만 관리 전용 프로파일러에 다음과 같은 여러 사항이 표시됩니다.
ICorProfilerCallback::UnmanagedToManagedTransition 콜백(비관리 코드가 관리 코드를 호출하거나 관리 코드로 되돌아갈 경우)
스레드 종료(비관리 코드가 스레드 루트에 있는 경우)
응용 프로그램 종료(비관리 코드가 응용 프로그램을 종료하는 경우)
CLR 처리기
CLR(공용 언어 런타임) 자체에서 예외를 처리할 수도 있습니다. 이 경우 프로파일러에서는 해제 단계가 표시되지만 catch 처리기의 알림을 받지 않습니다. 관리 코드 또는 비관리 코드에서 실행이 정상적으로 다시 시작될 수 있습니다.
처리되지 않은 예외
기본적으로 처리되지 않은 예외가 발생하면 .NET Framework 버전 2.0에서 처리가 종료됩니다. 관리되는 스레드의 예외에 설명된 대로 응용 프로그램 호환성 플래그를 사용하여 .NET Framework 버전 1 예외 정책을 준수하도록 할 수 있습니다.