显示堆栈的内容

时间:2009-03-26 19:30:19

标签: .net cil

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

有没有办法显示MSIL堆栈的内容?

e.g。如果我执行ldloc“some variable”,有没有办法查看堆栈并看到变量现在在堆栈上。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

使用WinDbg + SoS可以做到这一点以及更多。检查this question以获取有关如何使用WinDbg的参考。