Как распечатать текущую трассировку стека in.NET без каких-либо исключений?


У меня есть обычный код на C#. у меня нет исключений. Я хочу программно зарегистрировать текущую трассировку стека для отладки. Пример:

public void executeMethod() 
{
    logStackTrace();
    method();
}
5 268

5 ответов:

посмотреть System.Diagnostics пространство имен. Там много вкусностей!

System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();

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

Я бы рекомендовал вам изучить решения для ведения журнала (такие как NLog, log4net или Microsoft patterns and practices Enterprise Library), которые могут достичь ваших целей, а затем некоторых. Удачи, приятель!

альтернатива System.Diagnostics.StackTrace использовать

есть два способа сделать это. Элемент System.Diagnostics.StackTrace() даст вам трассировки стека для текущего потока. Если у вас есть ссылка на Thread например, вы можете получить трассировку стека для этого через перегруженную версию StackTrace().

вы также можете проверить вопрос переполнения стека как получить stacktrace non-current thread?.

Это также можно сделать в отладчике Visual Studio без изменения кода.

  1. создайте точку останова, где вы хотите увидеть трассировку стека.
  2. щелкните правой кнопкой мыши точку останова и выберите "действия..."в VS2015. В VS2010, выберите "при попадании...", затем включите "печать сообщения".
  3. убедитесь, что выбрано "продолжить выполнение".
  4. Введите текст, который вы хотели бы распечатать.
  5. добавить $CALLSTACK везде, где вы хотите видеть трассировка стека.
  6. запустить программу в отладчике.

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

   private void ExceptionTest()
    {
        try
        {
            int j = 0;
            int i = 5;
            i = 1 / j;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
            var stList = ex.StackTrace.ToString().Split('\');
            Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
        }
    }

Кажется, работает для меня