Stack Trace для входа в .NET - PullRequest
       3

Stack Trace для входа в .NET

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

Я написал модуль logger / exceptionfactory, который использует System.Diagnostics.StackTrace, чтобы получить атрибуты из вызывающих методов и их объявленные типы.Однако я заметил, что если я запускаю код вне Visual Studio в режиме Release, некоторые из моих более коротких методов становятся встроенными и пропадают из трассировки стека.Теперь у меня нет возможности проверить, будет ли метод встроен во время выполнения, но я не хочу [MethodImpl(MethodImplOptions.NoInlining)] каждый важный метод.Но если из-за этого будет отсутствовать метод из моих базовых классов, я могу неправильно прочитать информацию о слое и операциях, что может привести к ложному журналу или ошибочно заданным исключениям.

Есть ли эмпирическое правило о том, что указывается, где и когда?Виртуальные методы, статические методы, методы базового класса трактуются по-другому?Должен ли я беспокоиться только о прокладке внутри сборки?Внутри пространства имен?

Ответы [ 2 ]

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

Да, есть некоторые правила, но это эвристика, используемая компилятором JIT, и эта эвристика может измениться в любой момент.

  1. Виртуальные методы не могут быть встроены.
  2. Методы интерфейса, с другой стороны, могут быть встроенными, хотя я не уверен на 100%, приведет ли это к разрушению трассировки стека.
  3. Статические методы и методы не виртуальных экземпляров, безусловно, могут быть встроены.
  4. Встраивание может пересекать пространства имен (конечно) и сборки (не так очевидно), потому что это происходит во время выполнения, когда JIT компилирует вызов метода.
  5. «Тяжелые» методы не будут встроены. Это зависит от определения «тяжелого» и является частью эвристики, применяемой JIT.

Некоторые из эвристик для «тяжелых», о которых я знаю:

  • Методы, которые используют обработку исключений (то есть блоки try-catch или try-finally), не являются встроенными.
  • Методы с большим кодом (~ 32 IL-байта, но я могу помнить это неправильно) не являются встроенными.
  • Методы с циклами не являются встроенными (если цикл не может быть полностью развернут или исключен).
2 голосов
/ 31 января 2011

Эвристика - это все детали реализации джиттера, что означает, что они официально не документированы и, вероятно, могут быть изменены в любое время.

Сказав это, вот несколько статей, которые могут вас заинтересовать(хотя некоторые из них сейчас немного длинны в зубах):

...