检查托管堆栈

时间:2014-05-30 16:35:33

标签: .net stack-trace

.NET应用程序可以获得一个托管StackTrace来描述调用哪些方法,并保留对它们的引用以获取它们的名称,标记和签名,以及调用方法体中的IL偏移量。但它不包含传递给每个方法的参数值。

参数值肯定在某个进程的堆栈内存中,但这是本机表示,可能有点不方便且无法估计。

在JIT编译器之前,还有托管堆栈,CLR本质上执行的堆栈。在MSIL代码中,在执行call操作码之前,将参数放在该堆栈上。所以这些值也应该在CLR堆栈上。

问题是,托管应用程序是否可以在运行时检查其自己的托管堆栈以提取此类信息?

我不是在谈论像Visual Studio这样的单独调试程序。我想在这个过程中做到这一点。我也明白任何已执行的代码都会添加到堆栈中,所以这个东西需要设置一个“入口点”,我可以从中检查堆栈(即,如果CLR还保持堆栈悬挂在天花板上,则向根目录) ...),忽略我当前的方法及其调用的方法。

1 个答案:

答案 0 :(得分:1)

原因由Raymond Chen here描述。

缺点:

  

当方法仍在执行时,方法的参数可以符合收集条件。

它不直观,请阅读有关JIT和GC协同工作的部分。因此,StackTrace信息的限制是设计的。