1

当引发异常时,我为带有参数的 .NET 应用程序创建了一个小型转储

MiniDumpNormal | MiniDumpWithProcessThreadData | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules

这是提取托管调用堆栈所必需的(从What is minimum MINIDUMP_TYPE set to dump native C++ process that hosts .net component to be able to use !clrstack in windbg)。迷你转储生成在异常过滤器中执行,如此处所述

在 WinDBG 中的故障转储上执行!dumpstack时,可以看到类似

ChildEBP RetAddr  Caller,Callee
...
001dccc0 09b301a3 (MethodDesc 0x274268c +0x133 MyNameSpace.ErrorObject.FaultyMethod(Int32))
...

如果我没记错的话,这意味着错误是在方法 FaultyMethod 中的偏移量 0x133 处生成的,其中 0x133 是 JIT 编译的机器代码中的偏移量。

如何将此偏移量转换回源代码或 IL 行号以识别导致异常的指令?

4

2 回答 2

1

您是否尝试过使用 windbg 中的SOS.dll对其进行调试?您可以使用该CLRStack命令获取托管代码堆栈跟踪。有关加载它的说明,请参阅无法在 WinDbg 中加载 SOS 。但是,正如您所说,dumpstack给出了指令偏移量。

要转换指令偏移量,一种笨重但可行的方法是将可疑程序集加载到 ILDASM 中,深入研究类和方法/属性并查看 IL。指令前面是 IL_XXXX,其中 XXXX 是从方法开始的十六进制偏移量。它不会为您提供确切的代码,但会为您提供更多信息,尤其是在方法调用方面。

于 2012-09-24T11:00:29.747 回答
0

如果有人感兴趣,这是我解决问题的方法。它从添加MiniDumpWithIndirectlyReferencedMemoryMiniDumpWriteDump呼叫开始。这将导致包含堆栈上的指针引用的内存页面。尽管 MSDN 在我的测试中声明“此选项可以显着增加小型转储文件的大小”,但小型转储文件的大小增长不超过 100 KB。

现在,抛出异常的方法的编译机器代码在转储中可用。这种方式!u可以在 WinDBG/SOS 中用于反汇编代码。虽然这不完全是 IL 或源代码,但将机器代码指令与 IL/源代码匹配应该不会太难。这篇博客文章提供了一个如何做到这一点的示例。

于 2012-09-28T07:15:20.547 回答