分析WinDbg中的CLR .dmp文件

时间:2011-02-25 23:47:01

标签: c# debugging windbg

我在Visual Studio 2008中创建了一个C#.NET 3.5应用程序,该应用程序在没有开发环境的Windows XP SP3(x86)PC上崩溃。

我已经能够从PC获取.dmp文件并将其恢复到我的Windows 7 64位开发PC并将其加载到WinDbg 6.12中。

但是,我在C#应用程序的调用堆栈中看不到任何代码。看起来它完全是一个原生的调用堆栈。

!analyze -v的结果如下。

我在.DMP所在的目录中有相关的EXE,DLL和PDB文件。崩溃的可执行文件是在调试模式下编译的。

我也有Visual Studio 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 个答案:

答案 0 :(得分:6)

  

托管代码需要一个匹配的平台   sos.dll的正确分析。使用   'x86'调试器。

您必须使用 x86调试器/ WinDbg 来调试x86内存转储。使用.loadby sos mscorwks加载适当的sos。您还可以使用.chain命令验证扩展是否已正确加载。

Tess有一些很好的调试教程。

答案 1 :(得分:3)

This tutorial是一个很好的开始,可以看到一些WinDbg命令。我认为以下命令应该显示当前的堆栈跟踪:

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

答案 2 :(得分:1)

调试WinDbg中的托管故障转储需要额外的模块(主要是SOS.dll)和命令。

一些好的起始链接是here