2011-02-25 3 views
4

Visual Studio 2008에서 개발 환경이없는 Windows XP SP3 (x86) PC에서 충돌하는 C# .NET 3.5 응용 프로그램이 있습니다.WinDbg의 CLR .dmp 파일 분석

PC에서 .dmp 파일을 가져 와서 내 Windows   7 64 비트 개발 PC로 가져 와서 WinDbg 6.12로로드 할 수있었습니다.

그러나 C# 응용 프로그램에서 호출 스택의 코드를 볼 수 없습니다. 완전히 원시 호출 스택 인 것 같습니다.

!analyze -v의 결과는 아래와 같다.

은 내가 된 .dmp과 같은 디렉토리에 관련 EXE, DLL 및 PDB 파일이 있습니다. 크래시 된 실행 파일이 디버그 모드로 컴파일되었습니다. 즉 쉽게 사용할 수 있는지

는 또한 2008 년 비주얼   스튜디오   있습니다. 하지만 거기에 덤프 파일을 여는 것은 내 코드에서 가져온 것이 아니라 네이티브 호출 스택을 보여줍니다.

CLR 호출 스택을 어떻게 볼 수 있습니까?

0:004> !analyze -v 
******************************************************************************* 
*                    * 
*      Exception Analysis         * 
*                    * 
******************************************************************************* 


FAULTING_IP: 
kernel32!RaiseException+53 
7c812afb 5e    pop  esi 

EXCEPTION_RECORD: 0392f018 -- (.exr 0x392f018) 
ExceptionAddress: 7c812afb (kernel32!RaiseException+0x00000053) 
    ExceptionCode: e0434f4d (CLR exception) 
    ExceptionFlags: 00000001 
NumberParameters: 1 
    Parameter[0]: 80070057 

PROCESS_NAME: foo.exe 

ERROR_CODE: (NTSTATUS) 0xe0434f4d - <Unable to get error code text> 

EXCEPTION_CODE: (NTSTATUS) 0xe0434f4d - <Unable to get error code text> 

EXCEPTION_PARAMETER1: 80070057 

MOD_LIST: <ANALYSIS/> 

MANAGED_STACK: !dumpstack -EE 
No export dumpstack found 

MANAGED_BITNESS_MISMATCH: 
Managed code needs matching platform of sos.dll for proper analysis. Use 'x86' debugger. 

ADDITIONAL_DEBUG_TEXT: Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD] 

LAST_CONTROL_TRANSFER: from 79ef2bfc to 7c812afb 

FAULTING_THREAD: ffffffff 

DEFAULT_BUCKET_ID: STACKIMMUNE 

PRIMARY_PROBLEM_CLASS: STACKIMMUNE 

BUGCHECK_STR: APPLICATION_FAULT_STACKIMMUNE_NOSOS_CLR_EXCEPTION 

STACK_TEXT: 
00000000 00000000 foo.exe+0x0 


SYMBOL_NAME: foo.exe 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: foo 

IMAGE_NAME: foo.exe 

DEBUG_FLR_IMAGE_TIMESTAMP: 4d5da0cd 

STACK_COMMAND: ** Pseudo Context ** ; kb 

FAILURE_BUCKET_ID: STACKIMMUNE_e0434f4d_foo.exe!Unknown 

BUCKET_ID: APPLICATION_FAULT_STACKIMMUNE_NOSOS_CLR_EXCEPTION_foo.exe 

Followup: MachineOwner 
--------- 
+3

.NET 4.0을 사용하지 않는 관리되는 프로그램에 대한 Minidump 디버깅은 거의 기쁨이 아닙니다. 그것은 처리되지 않은 관리 예외에 폭탄을 투하했습니다. AppDomain.CurrentDomain.UnhandedException에 대한 이벤트 처리기를 작성하고 e.ExceptionObject.ToString() 값을 기록하거나 표시하여이를 진단 할 확률을 높입니다. 대다수의 경우에 문제의 원인을 진단 할만큼 충분히 좋습니다. –

+0

@Hans - try/catch 블록에서 Program.cs의 코드를 래핑했지만이 이벤트는 훨씬 더 깔끔합니다. 고맙습니다. – PaulH

답변

6

관리 코드는 적절한 분석을 위해 sos.dll의 매칭 플랫폼 이 필요합니다. 'x86'디버거 인 을 사용하십시오.

당신은 86 메모리 덤프를 디버깅하기 위해 86 디버거/WinDbg는를 사용해야합니다. 적절한 sos를로드하려면 .loadby sos mscorwks을 사용하십시오. .chain 명령을 사용하여 확장 프로그램이 제대로로드되었는지 확인할 수도 있습니다.

Tess는 좋은 디버깅 자습서를 가지고있다.

+0

@Naveen - 내 개발 PC는 Win 7 64-bit입니다. x86 디버거를 사용할 수 있습니까? 아니면이를 실행하기 위해 32 비트 VM을 만들어야합니까? – PaulH

+0

Windows x86 용 디버깅 도구를 사용해야합니다 (일치하는 덤프 비트 니스). 32 비트 VM도 작동하지만 필수는 아닙니다. –

+0

덤프가 열리고 SOS가로드되면! CLRStack 또는! pe가 호출 스택이나 예외를 표시 할 수 있습니다. –

1

은 디버깅 WinDbg는 추가 모듈 (주로 SOS.dll)와 명령을 필요로 크래시 덤프 관리.

좋은 시작 링크는 here이다.

+0

'.load sos' yields'LoadLibrary (sos)에 대한 호출이 실패했습니다. Win32 error 0n193' – PaulH

3

This tutorial는 WinDbg는 명령의 일부를 볼 수있는 좋은 시작이다. 나는 다음과 같은 명령을 당신에게 현재의 스택 트레이스를 표시해야합니다 생각 :

.sympath SRV*d:\localsymbols*http://msdl.microsoft.com/download/symbols 
!reload 
.loadby sos mscorwks 
K