在抛出异常时保留的内联函数的堆栈跟踪信息
本文关键字:函数 堆栈 跟踪 信息 抛出异常 保留 | 更新日期: 2023-09-27 18:19:13
在Release模式下编译可执行文件时——启用了代码优化——编译器可能会选择内联满足某些标准的函数,以提高性能。
我的问题是:当在内联的函数体中抛出异常时,无论内联展开如何,堆栈跟踪信息都会保留吗?换句话说,它会将原始函数显示为错误来源,还是会显示调用函数?
这取决于异常是如何抛出的。如果你使用throw语句,那么你就不会有问题,抖动不会内联包含throw的方法。当你需要一个快速的属性设置器时需要注意的一点。
然而,如果异常是由正常执行引起的,如NullReferenceException或IndexOutOfRangeException等,那么是的,如果它是内联的,那么您不会在堆栈跟踪中看到方法的名称。这可能有点令人困惑,但您通常可以从调用方法的源代码和异常类型中弄清楚。希望它相对较小。[MethodImpl(MethodImplOptions.NoInlining)]
属性可以抑制内联。当你发现它有帮助的时候,通常已经太迟了;)
这不是一个明确的答案,但我试图装饰一个简单的方法,只做除零与[MethodImpl(MethodImplOptions.AggressiveInlining)]
属性,在。net 4.5给出了一个提示JIT (它实际上执行内联)内联一个特定的方法,当我在发布模式下运行程序,异常报告从调用方法,而不是一个除法。另一方面,正如Hans所说,带有throw语句和复杂流逻辑的方法不是内联的。MSDN博客上的这篇文章(虽然是从2004年开始的)概述了JIT是如何完成内联的。