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

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

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

Ответ 1

Посмотрите на пространство имен System.Diagnostics. Здесь много лакомств!

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

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

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

Ответ 2

Альтернативой System.Diagnostics.StackTrace является использование System.Environment.StackTrace, который возвращает строковое представление stacktrace.

Другим полезным вариантом является использование переменных $CALLER и $CALLSTACK отладки в Visual Studio, поскольку это может быть включено во время выполнения без восстановления приложения.

Ответ 3

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

Вы также можете просмотреть вопрос о переполнении стека Как получить не текущий поток stacktrace?.

Ответ 4

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

  • Создайте точку останова, где вы хотите увидеть трассировку стека.
  • Щелкните правой кнопкой мыши точку останова и выберите "Действия..." в VS2015. В VS2010 выберите "When Hit...", затем включите "Печать сообщения".
  • Убедитесь, что выбрано "Продолжить выполнение".
  • Введите текст, который вы хотите распечатать.
  • Добавить $CALLSTACK везде, где вы хотите увидеть трассировку стека.
  • Запустите программу в отладчике.

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

Ответ 5

Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

Вывод будет похож на:

в YourNamespace.Program.executeMethod (Строка сообщения)

at YourNamespace.Program.Main(String [] args)

Замените Console.WriteLine на ваш метод Log. На самом деле, нет необходимости в .ToString() для случая Console.WriteLine, так как он принимает object. Но вам может понадобиться это для вашего метода Log (string msg).

Ответ 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]);
        }
    }

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