我的情况比较特殊。我一直在开发一个用于发送电子邮件的开源库。在这个库中,我需要一种可靠的方法来获取调用方法。我已经用一个完成了这个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 正在内联它。我读过,您可以通过将方法设为虚拟来防止内联,但这不起作用。有谁知道防止方法内联的可靠方法,以便您的方法将显示在堆栈跟踪中?
你可以使用MethodImplAttribute http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimplattribute.aspx并指定MethodImplOptions.NoInlining http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx.
[MethodImpl(MethodImplOptions.NoInlining)]
void YourMethod()
{
// do something
}
请注意,这仍然不能保证您可以获得源代码中所示的实际调用方法。您的方法不会被内联,但您的方法的调用者可以内联到它自己的调用者中,等等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)