我有一个比较独特的情况。我一直在开发一个用于发送电子邮件的开源库。在这个库中,我需要可靠地获取调用方法。我通过分析StackTrace
中的StackFrame
对象来实现了这一点。在关闭优化的调试模式项目中,这可以正常工作。
问题出现在我切换到开启优化的发布模式时。堆栈跟踪看起来像这样:
> FindActionName at offset 66 in file:line:column <filename unknown>:0:0
> Email at offset 296 in file:line:column <filename unknown>:0:0
> CallingEmailFromRealControllerShouldFindMailersActionName at offset 184
in file:line:column <filename unknown>:0:0
> _InvokeMethodFast at offset 0 in file:line:column <filename unknown>:0:0
> InvokeMethodFast at offset 152 in file:line:column <filename unknown>:0:0
...
以下内容来自一个失败的单元测试。在这个跟踪记录的第3行,我应该看到一个叫做TestEmail
的方法,它在其他地方有定义,但我相信JITter正在对其进行内联优化。我了解到可以通过将方法设置为虚方法来防止内联优化,但这种方法并不奏效。是否有人知道一种可靠的方法来防止方法内联优化,以便在堆栈跟踪中显示出您的方法?