gpt4 book ai didi

c# - 防止方法上的 JIT 内联

转载 作者:IT王子 更新时间:2023-10-29 04:16:35 25 4
gpt4 key购买 nike

我的情况比较特殊。我一直在研究用于发送电子邮件的开源库。在这个库中,我需要一种可靠的方法来获取调用方法。我通过分析其中的 StackFrame 对象,使用 StackTrace 完成了此操作。这在关闭优化的 Debug模式项目中没有问题。

当我切换到打开优化的 Release模式时出现问题。堆栈跟踪看起来像这样:

> 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并指定 MethodImplOptions.NoInlining .

[MethodImpl(MethodImplOptions.NoInlining)]
void YourMethod()
{
// do something
}

请注意,这仍然不能保证您可以获得源代码中所见的实际调用方法。您的方法不会被内联,但您的方法的调用者可以内联到它自己的调用者中,等等。

关于c# - 防止方法上的 JIT 内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5169219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com