我正在使用 Windbg(带有 sos 扩展名)并尝试调试崩溃的应用程序。我能够转储引发异常的调用的 IL,并且通过检查代码,如果我可以转储评估堆栈的内容,我似乎可以获得所需的信息。可以用 WinDbg & sos 做什么吗?
这是我所做的:
- 启动 WinDbg
- 附加到崩溃的进程
- loadby sos mscorwks (加载 sos 扩展)
!token2ee theModuleName 0600009a (其中theModuleName是我正在调试的应用程序(和程序集)的名称,9a是 Windows 错误报告工具报告的崩溃方法的方法偏移量。我得到了这个输出:
模块:000e2c3c (theApplicationName.exe)
令牌:0x0600009a
MethodDesc:000e67c8
名称:MyNamespace.MyClassName.theCulpritFn(MyOtherClass)
JITTED 代码地址:0081b1d0!dumpil 00e67c8 (它为所讨论的方法转储了 IL)。这是输出:
// .. // .. the previous code omitted for brevity .catch { IL_0071: stloc.0 IL_0072: nop IL_0073: ldstr "Can't set CurrentServer property for: " IL_0078: ldarg.0 IL_0079: ldfld MyNamespace.MyClassName::_currentServer IL_007e: brtrue.s IL_0087 IL_0080: ldstr "" IL_0085: br.s IL_0092 IL_0087: ldarg.0 IL_0088: ldfld MyNamespace.MyClassName::_currentServer IL_008d: callvirt MyNamespace.MyOtherClass::get_Name IL_0092: call System.String::Concat IL_0097: ldloc.0 IL_0098: newobj MyNamespace.MySpecialExceptionType::ctor IL_009d: throw }
问题是:有没有办法让我看到在抛出异常之前压入堆栈的内容。如果我没记错的话,传递给异常构造函数的参数应该是评估堆栈上索引 0 处的局部变量。
PS 当我尝试调用!clrstack -a时,我收到一条消息:无法遍历托管堆栈。当前线程可能不是托管线程。您可以运行 !threads 以获取进程中的托管线程列表。
谢谢!