内联函数的堆栈跟踪是否在抛出的异常中保留?

时间:2013-06-20 22:54:49

标签: c# .net exception inline

Release 模式下编译可执行文件时 - 启用代码优化 - 编译器可以选择内联满足特定条件的函数以提高性能。

我的问题是:当内联函数的主体中抛出异常时,无论内联扩展如何都会保留堆栈跟踪信息吗?换句话说,它是否会显示原始函数作为错误的来源,还是会显示调用函数?

2 个答案:

答案 0 :(得分:6)

这不是一个明确的答案,但我试图修饰一个简单的方法,只用[MethodImpl(MethodImplOptions.AggressiveInlining)]属性除以零,在.NET 4.5中给出一个提示JIT (实际上执行内联) )内联某个方法,当我在发布模式下运行程序时,从调用方法报告了异常,而不是分区的异常。另一方面,正如Hans所说,带有throw语句和复杂流逻辑的方法没有内联。 MSDN博客上的This Article(尽管从2004年开始)为您提供了JIT如何完成内联的概述。

答案 1 :(得分:5)

这取决于抛出异常的方式。如果您使用 throw 语句,那么您没有问题,抖动将不会内联包含throw的方法。当你需要一个属性设置器快速btw时要注意的事情。

但是,如果异常是由正常执行引起的,比如NullReferenceException或IndexOutOfRangeException等,那么是的,如果内联的话,你看不到堆栈跟踪上方法的名称。这可能有点令人困惑,但您通常会从调用方法的源代码和异常类型中弄清楚它。希望它相对较小。 [MethodImpl(MethodImplOptions.NoInlining)]属性可用于禁止内联。当你发现它会有所帮助时,通常为时已晚;)