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

8 .net c# inline exception

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

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

Han*_*ant 7

这取决于抛出异常的方式.如果使用throw语句然后没有问题,则抖动不会内联包含throw的方法.当你需要一个属性设置器快速顺便说一下时要注意的事情.

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


Ibr*_*jar 6

这不是一个明确的答案,但我试图装饰一个简单的方法,只有[MethodImpl(MethodImplOptions.AggressiveInlining)]在.NET 4.5中给出一个提示JIT (实际上执行内联)的内容,以内联某个方法并且当我运行程序在发布模式下,异常是从调用方法报告的,而不是具有除法的方法.另一方面,正如Hans所说,带有throw语句和复杂流逻辑的方法没有内联.本文在MSDN博客(虽然从2004)提供了关于如何内联是由JIT做了概述.