Распечатать информацию о трассировке стека с C#

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

Трассировка стека .NET на моей машине выглядит так:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(String path)
at LVKWinFormsSandbox.MainForm.button1_Click(Object sender, EventArgs e) in C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36

У меня такой вопрос:

Формат выглядит так:

at <class/method> [in file:line ##]

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

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

Другими словами, мне нужна эта информация из приведенного выше текста:

C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36

Любые советы, которые вы дадите, будут полезны.

Я хотел бы, чтобы кто-то дал ответ на синтаксический анализ, поскольку я работаю с записанными строками из произвольных приложений и действительно надеялся получить некоторые подробности по этому поводу. Учитывая, что у вас есть контроль над источником StackTrace, вы действительно выбрали правильный ответ :)

TheXenocide 18.09.2012 17:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
51
1
46 232
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы должны иметь возможность получить объект StackTrace вместо строки, сказав

var trace = new System.Diagnostics.StackTrace(exception);

Затем вы можете сами посмотреть на фреймы, не полагаясь на форматирование фреймворка.

См. Также: Ссылка на StackTrace

Ооо, мило, я этого не знала! Я обязательно займусь этим.

Lasse V. Karlsen 09.09.2008 17:55

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

yusuf 16.03.2009 12:15

Я сериализую исключение в файл. SerializationHelper.Serialize(@"c:\temp\ConfigurationErrorsE‌​xceptions.ser", ex); Если я десериализую из файла var exception = SerializationHelper.Deserialize(@"ConfigurationErrorsExcepti‌​ons.ser");, След будет нет в наличииvar trace = new System.Diagnostics.StackTrace(exception as Exception);, FrameCount будет 0

Kiquenet 13.10.2015 12:58

В качестве альтернативы log4net, хотя и потенциально опасен, дал мне лучшие результаты, чем System.Diagnostics. По сути, в log4net у вас есть метод для различных уровней журнала, каждый с параметром Exception. Итак, когда вы передадите второе исключение, оно распечатает трассировку стека для любого настроенного вами приложения.

пример: Logger.Error("Danger!!!", myException );

Результат, в зависимости от конфигурации, выглядит примерно так:

System.ApplicationException: Something went wrong.
   at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35
   at Adapter.GetDistributionDocument(Int32 id) in C:\Adapter.vb:line 181
   ...

Не могли бы вы пояснить, что вы имеете в виду, говоря о том, что log4net «потенциально опасен»?

Scott Lawrence 09.09.2008 17:33

Я не знаю наверняка, что имел в виду Oglester, но я знаю, что у stackoverflow.com были некоторые проблемы с взаимоблокировкой, потому что log4net регистрировал исключения в базе данных. У меня лично не было никаких проблем, но я сохраняю простоту и придерживаюсь прокатки текстовых файлов.

Don Kirkby 17.09.2008 09:29

Если вы не будете правильно управлять своими ссылками, вы получите утечку памяти. Веб-сайт, над которым я работал некоторое время назад, широко использует log4net (катящиеся файлы). Поскольку log4net ссылается на файл (небезопасно), вы должны быть уверены, что сохранили ссылки log4net в чистоте или до минимума.

Greg Ogle 02.10.2008 17:09

Вот код, который я использую для этого без исключения

public static void LogStack()
{
  var trace = new System.Diagnostics.StackTrace();
  foreach (var frame in trace.GetFrames())
  {
    var method = frame.GetMethod();
    if (method.Name.Equals("LogStack")) continue;
    Log.Debug(string.Format("{0}::{1}", 
        method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
        method.Name));
  }
}

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

Denise Skidmore 30.03.2015 23:30

Просто чтобы сделать это 15-секундным ответом на копирование и вставку:

static public string StackTraceToString()
{
    StringBuilder sb = new StringBuilder(256);
    var frames = new System.Diagnostics.StackTrace().GetFrames();
    for (int i = 1; i < frames.Length; i++) /* Ignore current StackTraceToString method...*/
    {
        var currFrame = frames[i];
        var method = currFrame.GetMethod();
        sb.AppendLine(string.Format("{0}:{1}",                    
            method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
            method.Name));
    }
    return sb.ToString();
}

(на основе ответа Линдхольма)

Спасибо за это. Обратите внимание, что вы можете использовать sb.AppendLine (...), чтобы избежать жесткого кодирования конкретного символа конца строки.

Lee Oades 30.05.2012 13:25

Или есть еще более короткая версия ..

Console.Write(exception.StackTrace);

Другие вопросы по теме