1

我在 Visual Studio 中或通过 Mdbg 运行 MSIL。

有什么方法可以显示 MSIL 堆栈的内容吗?

例如,如果我执行 ldloc“某个变量”,有没有办法查看堆栈并看到该变量现在在堆栈上。

我假设 MSIL 堆栈与 CPU 堆栈不同,即 SP 寄存器指向的内存?

4

2 回答 2

6

在运行时,实际上没有任何“MSIL”堆栈。即使在调试模式下,执行的代码也始终是 JIT 编译的。JIT 编译 MSIL 的过程将其从虚拟堆栈机器“扁平化”为您正在运行的平台的普通汇编代码。如果值已经在寄存器中,这意味着ldloc.0最终可能会被翻译成类似的东西,甚至是无操作。mov eax, [sp + 4]如果要调试特定指令ldloc,则必须在反汇编中查看它,以查看 ldoloc 被翻译成什么以及它实际从哪里加载数据。

WinDbg + SoS 工具(在另一篇文章中提到)将帮助您从托管代码的角度查看 CPU 堆栈。但是,它们不允许您查看“MSIL”堆栈,因为没有可查看的堆栈。

于 2009-05-20T18:48:50.617 回答
1

您可以使用 WinDbg + SoS 做到这一点,甚至更多。检查此问题以获取有关如何使用 WinDbg 的参考资料。

于 2009-03-26T19:35:18.823 回答