Исключительная разница в трассе между режимами Debug и Release

В приведенном ниже коде генерируется трассировка стека исключений в обоих режимах отладки и выпуска:

static class ET
{
    public static void E1()
    {
        throw new Exception("E1");
    }
    public static void E2()
    {
        try
        {
            E1();
        }
        catch (Exception e)
        {

            throw;

        }
    }

    public static void Entry()
    {
        try
        {

            E2();
        }
        catch (Exception e)
        {           
            Console.WriteLine(e.StackTrace);
        }
    }
}

Результат в режиме отладки:

в ET.E1() в D:\myStudio\CSharp\CSharp4.0\MyCSharp\ExceptionHandling.cs: строка 47

в ET.E2() в D:\myStudio\CSharp\CSharp4.0\MyCSharp\ExceptionHandling.cs: строка 58

в ET.Entry() в D:\myStudio\CSharp\CSharp4.0\MyCSharp\ExceptionHandling.cs: строка 68

Результат в режиме деблокирования:

в ET.E2() в D:\myStudio\CSharp\CSharp4.0\MyCSharp\ExceptionHandling.cs: строка 55

в ET.Entry() в D:\myStudio\CSharp\CSharp4.0\MyCSharp\ExceptionHandling.cs: строка 68

Обратите внимание, что первая строка из результата в режиме Release отсутствует. Как вернуть строку нарушения в режим выпуска.

Ответ 1

Вероятно, вы видите результат inlining. Когда вы компилируете в режиме отладки, inlining всегда отключается (так что отладка имеет смысл). Когда вы компилируете в режиме выпуска, компилятор удалит определенные методы (с учетом множества правил) и вставляет их содержимое во все сайты вызовов. Это улучшает общую производительность этих методов, удаляя служебные данные вызова метода.