.NET应用程序可以获取托管StackTrace
,该托管StackTrace
描述了调用了哪些方法,并保存了对这些方法的引用以获取它们的名称、令牌和签名,以及在方法主体中进行调用的IL偏移量。但它不包含传递给每个方法的参数值。
参数值肯定在进程的堆栈内存中的某个地方,但这是本机表示,可能有点不方便和不可预测的评估。
在JIT编译器之前,还有托管堆栈,CLR基本上在其上执行。在MSIL代码中,参数在执行call
操作码之前放在该堆栈上。因此这些值也应该在CLR堆栈上。
问题是,托管应用程序是否可以在运行时检查其自己的托管堆栈以提取此类信息?
我不是在说像Visual Studio这样的独立调试器进程。我想从进程内部完成这项工作。我也知道任何执行的代码都将添加到堆栈中,因此这件事需要设置一个特定的“入口点”,从那里我可以向上检查堆栈(也就是说,如果CLR也保持堆栈挂在天花板上,则向根目录移动……),忽略我的当前方法及其调用的方法所做的。
1条答案
按热度按时间jhdbpxl91#
原因由Raymond Chen here描述。
简而言之
当方法仍在执行时,方法的参数可以变得符合收集条件。
这并不直观,请阅读关于JIT和GC一起工作的部分。因此,StackTrace信息的限制是由设计造成的。