我在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
---------
答案 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。