Как я могу сказать компилятору игнорировать метод в трассировке стека? - PullRequest
9 голосов
/ 27 января 2011

Могу ли я применить какие-либо атрибуты к шаблонным методам, чтобы такие методы не появлялись в трассировках стека?У меня их много, а в некоторых случаях они глубиной в несколько уровней.Это просто беспорядок.

Пример кода:

class Program
{
    public static void ThrowMe()
    {
        throw new NotImplementedException();
    }

    public static void HideMe()
    {
        ThrowMe();
    }
    static void Main(string[] args)
    {
        try
        {
            HideMe();
        }
        catch (Exception e)
        {

        }
    }
}

Это создает трассировку стека:

в Spork.Program.ThrowMe () в C: \Проекты \ XXX \ Тестовая песочница \ ConsoleTesting \ Program.cs: строка 58

в Spork.Program.HideMe () в C: \ Projects \ XXX \ Тестовая песочница \ ConsoleTesting \ Program.cs: строка 64

в Spork.Program.Main (String [] args) в C: \ Projects \ XXX \ Тестовая песочница \ ConsoleTesting \ Program.cs: строка 70

Ответы [ 3 ]

7 голосов
/ 27 января 2011

Поместите Console.WriteLine (e) в блок захвата.Переключитесь на сборку релиза и нажмите Ctrl + F5.Вы увидите это:

System.NotImplementedException: The method or operation is not implemented.
   at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9
   at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 

Обратите внимание, что метод HideMe () не видим в трассировке стека.Миссия выполнена.

Вызов метода не был показан в трассировке, потому что оптимизатор JIT встроил метод : это единственный способ скрыть методы в трассировке стека.

Это не то, что вы можете хорошо контролировать, метод должен быть «маленьким» и не вызывать никаких исключений сам по себе.В противном случае это обычно считается проблемой, а не особенностью.Трудно понять, как код получил от А до Б.

5 голосов
/ 27 января 2011

Вы можете использовать DebuggerHiddenAttribute

0 голосов
/ 24 августа 2018

Если ваш метод недостаточно прост для автоматической вставки, вы можете дать компилятору четкую подсказку, что вы хотите, чтобы он был с атрибутом [MethodImpl(MethodImplOptions.AggressiveInlining)].

Вы все еще должны скомпилировать в релизережим.

...