Как распечатать текущий Stack Trace в .NET без каких-либо исключений? - PullRequest
306 голосов
/ 10 февраля 2009

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

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

Ответы [ 6 ]

350 голосов
/ 10 февраля 2009

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

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

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

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

195 голосов
/ 08 июля 2011

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

Еще одна полезная опция - использовать отладочные переменные $CALLER и $CALLSTACK в Visual Studio , поскольку это можно включить во время выполнения без перестройки приложения.

37 голосов
/ 10 февраля 2009

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

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

13 голосов
/ 09 декабря 2015

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

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

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

3 голосов
/ 20 декабря 2018
Console.WriteLine(
    new System.Diagnostics.StackTrace().ToString()
    );

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

at YourNamespace.Program.executeMethod (String msg)

в YourNamespace.Program.Main (строка [] args)

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

0 голосов
/ 29 мая 2018
   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]);
        }
    }

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

...