2013-06-05 2 views
1

나는 무작위 적으로 충돌하는 .NET 응용 프로그램을 개발 중입니다. 그것은 처리되지 않은 예외를 던지고있는 것으로 의심되는 관리되지 않는 DLL에 대한 참조를 가지고 있습니다. 디버거가 연결되지 않은 경우 응용 프로그램이 충돌, 나는이 메시지를받을 때 (컴파일 등 클릭 한 번) :CLR에서 처리하지 않는 예외를 디버그하는 방법

enter image description here

하는 시점에서 디버거로 VS2012를 연결하고 호출 스택 볼 수 있습니다

> ntdll.dll!77e015de() Unknown 
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!77e015de() Unknown 
ntdll.dll!77e8861b() Unknown 
ntdll.dll!77eae656() Unknown 
ntdll.dll!77eae6d3() Unknown 
ntdll.dll!77e573bc() Unknown 
ntdll.dll!77e57261() Unknown 
ntdll.dll!77e3b459() Unknown 
ntdll.dll!77e3b42b() Unknown 
ntdll.dll!77e3b3ce() Unknown 
ntdll.dll!77df0133() Unknown 
msvcr100.dll!71fb0269() Unknown 
msvcr100.dll!71fb0146() Unknown 
mfc100.dll!6c9e3bef() Unknown 
kernel32.dll!76ba14dd() Unknown 
msvcr100.dll!71fb016a() Unknown 
mfc100.dll!6cbbb734() Unknown 
DataRayOcx.ocx!095fe026() Unknown 
kernel32.dll!76ba14dd() Unknown 
msvcr100.dll!71fb016a() Unknown 
mfc100.dll!6cbbb734() Unknown 
mfc100.dll!6c9e3e62() Unknown 
DataRayOcx.ocx!096018c4() Unknown 
DataRayOcx.ocx!09603679() Unknown 
msvcr100.dll!71ffc556() Unknown 
msvcr100.dll!71ffc600() Unknown 
kernel32.dll!76ba33aa() Unknown 
ntdll.dll!77e19ef2() Unknown 
ntdll.dll!77e19ec5() Unknown 

스레드 :

Not Flagged  5732 0 Worker Thread msvcr100.dll thread 
DataRayOcx.ocx!09664787 Highest 
Not Flagged  5480 0 Main Thread Main Thread clr.dll!70903e82 Normal 
Not Flagged  4408 0 Worker Thread MG17Comms.dll thread mfc100.dll!6cb8e160 Normal 
Not Flagged > 4428 0 Worker Thread msvcr100.dll thread msvcr100.dll!71fb0269 Normal 
Not Flagged  116 0 RPC Thread RPC Callback Thread 1714fee0 Normal 
Not Flagged  5808 0 Worker Thread ntdll.dll thread ntdll.dll!77e01f26 Normal 
Not Flagged  5372 0 Worker Thread clr.dll thread clr.dll!7082c3a6 Normal 
Not Flagged  5112 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  4928 0 Worker Thread clr.dll thread clr.dll!7090f1e3 Normal 
Not Flagged  1380 0 Worker Thread clr.dll thread clr.dll!708219a3 Normal 
Not Flagged  1632 0 Worker Thread OphirLMMeasurement.dll thread OphirLMMeasurement.dll!6ad4a94d Normal 
Not Flagged  4324 0 Worker Thread MG17Core.dll thread MG17Motor.ocx!10034e20 Normal 
Not Flagged  5048 0 Worker Thread clr.dll thread nipalu.dll!6459a78a Normal 
Not Flagged  5028 0 Worker Thread clr.dll thread msvcr110_clr0400.dll!72a551ed Normal 
Not Flagged  5556 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  4708 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  3352 0 Worker Thread clr.dll thread nipalu.dll!6459a78a Normal 
Not Flagged  5256 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  6032 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  4692 0 Worker Thread OphirLMMeasurement.dll thread OphirLMMeasurement.dll!6add537a Normal 
Not Flagged  6108 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  1504 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  1108 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  4652 0 Worker Thread wdapi1031.dll thread wdapi1031.dll!11513a0b Normal 
Not Flagged  2796 0 Worker Thread OphirLMMeasurement.dll thread OphirLMMeasurement.dll!6add5f80 Normal 
Not Flagged  1036 0 RPC Thread RPC Callback Thread ole32.dll!76e7a44e Normal 
Not Flagged  3424 0 Worker Thread clr.dll thread clr.dll!708d8274 Normal 
Not Flagged  5424 0 Worker Thread clr.dll thread clr.dll!708f7bc5 Highest 
Not Flagged  504 0 Worker Thread ntdll.dll thread ntdll.dll!77e0013d Normal 
Not Flagged  2380 0 Worker Thread clr.dll thread clr.dll!70b10aed Normal 
Not Flagged  3060 0 Worker Thread GdiPlus.dll thread GdiPlus.dll!7327795b Normal 
Not Flagged  3672 0 Worker Thread clr.dll thread System.Windows.Forms.ni.dll!6ddfe8e1 Normal 
Not Flagged  5268 0 Worker Thread msiltcfg.dll thread msiltcfg.dll!7371187a Normal 
Not Flagged  1232 0 Worker Thread msvcr100.dll thread msvcr100.dll!71fb326f Normal 
Not Flagged  5588 0 Worker Thread clr.dll thread clr.dll!7090fee1 Normal 
Not Flagged  4080 0 Worker Thread clr.dll thread clr.dll!708598cd Normal 
Not Flagged  5380 0 Worker Thread msvcr100.dll thread DataRayOcx.ocx!095cd1ed Normal 
Not Flagged  5328 0 Worker Thread System.Data.dll thread System.Data.dll!7140b7fd Normal 
Not Flagged  5744 0 Worker Thread AS5216.dll thread AS5216.dll!061d3e74 Normal 
Not Flagged  2952 0 Worker Thread AS5216.dll thread AS5216.dll!061d01dd Above Normal 
Not Flagged  3008 0 Worker Thread AS5216.dll thread AS5216.dll!061d8e2e Above Normal 
Not Flagged  4728 0 Worker Thread clr.dll thread clr.dll!7090f1e3 Normal 
Not Flagged  2972 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  3804 0 Worker Thread nirpc.dll thread nirpc.dll!6460546a Normal 
Not Flagged  6064 0 Worker Thread msvcr90.dll thread mxsout.dll!1b45be1b Normal 
Not Flagged  3728 0 Worker Thread msvcr90.dll thread mxsout.dll!1b45bd23 Normal 
Not Flagged  768 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal 
Not Flagged  6096 0 Worker Thread clr.dll thread clr.dll!70827f40 Normal 

하지만 난 정말 읽을하는 방법을 모르겠어요. 첫 번째 줄 Not Flagged 5732 0 Worker Thread msvcr100.dll thread DataRayOcx.ocx!09664787 Highest은 내가 그 구성 요소를 의심하게 만드는 가장 높은 우선 순위를가집니다.

나는이 메시지 예외를 잡아 얻을 수 있어요 계기로

: 단지 문제가 디버거 정보를 기반으로 무엇을 추측

'External component has thrown an exception.' in System.Windows.Forms.DispatchMessageW() as System.IntPtr 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at Utilities.StartupForm.Main() in C:\...\Utilities\Forms\StartupForm.vb:line 102 

외부는 예외의 유형을 디버깅 할 수있는 좋은 방법은 무엇입니까 ? 우리는 제 3 자 소프트웨어를 사용하고 있으므로, 구성 요소가 예외를 발생시킬 때이를 경고 할 수 있어야합니다 ...하지만 먼저 문제를 정확하게 식별해야합니다.

+0

질문에 많은 유용한 정보가 없으므로 Microsoft Symbol 서버를 활성화하십시오. 그러나 이것이 DataRayOcx를 가리키고 있음을 분명히 알 수 있습니다. 이것은 호출 스택에서 직접 볼 수 있습니다. 또한 DispatchMessageW()가 충돌하게하는 종류의 컨트롤입니다. 이것을 디버깅하거나 수정할 수없고 소스 코드가 없습니다. 공급 업체 만이 문제를 해결할 수있는 작은 복제 프로그램을 제공 할 수 있습니다. –

+0

@ 한스, 잠시 동안 DataRayOcx에 오류가있는 것으로 의심됩니다. 내 질문은 "나에게이 문제를 해결해주세요"와 같은 질문이지만, 그렇지 않습니다. CLR에서 처리하지 않는 예외를 디버깅하는 방법을 묻는 중 "이 예외 유형을 디버깅하는 좋은 방법은 무엇입니까?" 나는 그것을 고칠 수 없다. 나는 그 사실을 확실히 알고있다. 그러나 당신의 결론을 이끌어 낸 것은 정확히 무엇을 보았습니까? 그동안 Microsoft Symbol 서버를 사용할 수있게되었습니다. (그리고 How/Why/What가 무엇인지를 학습합니다.) – djv

답변

1

디버거는 이런 종류의 문제를 확인하는 것이 가장 좋습니다. 그래서 당신이 한 일은 정확합니다. 유일한 문제는 유효하지 않은 심볼이있어서 콜 스택이 당신에게별로 알려주지 않았다는 것입니다.

@Hans가 지적한대로해야 할 일은 디버거에 Microsoft Symbol 서버를 구성하는 것입니다 (_NT_SYMBOL_PATH 전역 시스템 변수를 설정하여이 작업을 수행 할 수 있습니다). 심볼 서버가 활성화되면 디버거 (예 : Visual Studio)가 시스템 모듈 (dll 및 exe 파일)의 .pdb 파일을 자동으로 다운로드합니다. PDB 파일에는 스택에서 원시 주소를 디코딩하는 방법에 대한 디버거에 대한 지침이 들어 있습니다. 현재 통화 스택을 다음과 같이 변환합니다.

ntdll.dll!77e015de() Unknown 
ntdll.dll!77e8861b() Unknown 
ntdll.dll!77eae656() Unknown 
ntdll.dll!77eae6d3() Unknown 

훨씬 의미있는 것으로. 스택을 위에서 아래로 스캔하면 결함있는 방법 (타사 라이브러리의 PDB 파일이있는 경우)과이를 소유 한 모듈 (dll)을 찾아야합니다. 또한 실수 한 순간에 미니 덤프를 생성하고 (예 : procdump 사용) 라이브러리 소유자에게 검사를 위해 보낼 수 있습니다.