调用堆栈中的“[轻量级函数]”

Posted

技术标签:

【中文标题】调用堆栈中的“[轻量级函数]”【英文标题】:"[Lightweight Function]" in the call stack 【发布时间】:2010-11-24 06:24:05 【问题描述】:

我正在调试一个程序 (VS2008),并且正在逐步执行代码行。我遇到了正在调用委托函数的一行,我试图进入它。然而,不是像我预期的那样单步执行该方法,而是绕过了该方法,而是使用调试器单步执行我认为是委托调用的函数。在调用堆栈中,我期望委托方法所在的行显示为灰色,并带有文本 [Lightweight Function]

“轻量级功能”部分是什么意思?有没有办法进入这个功能?

【问题讨论】:

天啊,首先 Visual Studio 告诉我“此代码是由工具生成的”,现在它正在调用我的函数“轻量级”?什么态度! :) 检查你的编译设置,也许优化已经启用并且函数可以被优化掉(内联) 【参考方案1】:

我相信轻量级函数是指DynamicMethod,即在运行时发出、使用然后卸载的函数。

这篇博文与 Iron Python 相关,但该信息应该适用于任何 .NET 项目:Viewing Emitted IL。作者向您展示了如何使用较低级别的调试器(windbg.exe)来查看这些“轻量级函数”。

【讨论】:

【参考方案2】:

看起来这是DynamicMethod。请参阅this 了解一些见解。

不过,我不确定是否要采用动态方法。

【讨论】:

【参考方案3】:

DynamicMethod 的调用堆栈(在调试和发布模式下):

[Lightweight Function]  
[Native to Managed Transition]  
mscorlib.dll!System.Reflection.Emit.DynamicMethod.Invoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture) + 0x199 bytes

纯的

【轻量级功能】

动态方法的委托被调用时,可以观察到框架。

【讨论】:

以上是关于调用堆栈中的“[轻量级函数]”的主要内容,如果未能解决你的问题,请参考以下文章

Scala:用于Java的轻量级函数式编程

翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

翻译连载 | JavaScript 轻量级函数式编程-第3章:管理函数的输入 |《你不知道的JS》姊妹篇

翻译连载 | 第4章:组合函数-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

翻译连载 | JavaScript 轻量级函数式编程-第2章:函数基础 |《你不知道的JS》姊妹篇

翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇