VIsual Studio 2010을 사용하면서 약간 이상한 점을 발견했다. 런타임 오류가 발생했을 때 발생지점에서 중단되지 않고 try 구문인양 루틴을 빠져나가 버리는 현상이 그것인데, 이전 버전에서도 그랬는지는 모르겠다. 그런 현상이 발생하는 정확한 조건은 모르지만, 우선은 메뉴에서 '디버그 - 예외'를 눌러 예외 중단 설정을 변경할 수 있다. 메뉴에서 보이지 않는다면 'Ctrl+D, E'의 단축키로 대신할 수 있다. 아래의 샷은 Visual C# 2010 Express 버전의 모습이다.


적절한 항목에 'Throw됨' 체크를 하고 확인을 누르면, 신나게 디버깅할 수 있다. 다만, try 구문 내의 오류도 중단 대상이 되는 듯.

참고로 예외는 개발환경의 글로벌 설정이 아니라 프로젝트별 설정이다.

*예외 중단이 잘 동작 하지만 try { ... } 안에서도 중단되는 경우가 있다. 해외 사이트를 봐도 VS 2010의 새로운 예외 중단 동작 방식에 대해 혼란을 느낀다는 것을 알고 있는데, 아직은 확실한 조건을 이해하지 못했다.

*VS 2012에서 이 혼란이 완전히 사라졌다. 예외 설정을 변경하지 않아도 예외 발생지점을 잘 표시하며 그때 그때 무시할 수 있는 옵션도 제공한다.


CLR에서 단일 스레드로 함수 수행시 오랫동안 응답이 없을 경우 데드락으로 예외처리를 하게 되어 런타임이 중단되며 VS에서 아래와 같은 메시지가 출력된다.


The CLR has been unable to transition from COM context 0x118b008 to COM context 0x118b178 for 60 seconds. The thread that owns the destination contex
ContextSwitchDeadlock was detected
Message: The CLR has been unable to transition from COM context 0x118b008 to COM context 0x118b178 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

구조적인 코드변경을 하지 않고 해결할 수 있는 방법이 있다. 프로젝트가 로드된 상태에서 디버그 메뉴의 '예외(Ctrl+D, E)'를눌러 아래와 같이 'ContextSwitchDeadlock' 항목의 'Thrown' 체크를 해제한다.

 
 *출처: http://dotnetdud.blogspot.com/2009/01/clr-has-been-unable-to-transition-from.html