다음을 통해 공유


프로파일링 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 예외 정책을 준수하도록 할 수 있습니다.

참고 항목

개념

프로파일링 개요