В С# как собрать трассировку стека программы сбой

Я новичок в С#. Я пишу небольшое приложение на основе рабочего стола, и мне нужно иметь эту функцию в приложении.

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

Пожалуйста, дайте мне указания по этому вопросу.

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

Благодарю вас,

Ответы

Ответ 1

Чтобы уловить все необработанные исключения, добавьте это в program.cs:

    [STAThread]
    static void Main()
    {
    AppDomain currentDomain = default(AppDomain);
    currentDomain = AppDomain.CurrentDomain;
    // Handler for unhandled exceptions.
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler;
    // Handler for exceptions in threads behind forms.
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler;
    ...
    }

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
   Exception ex = default(Exception);
   ex = (Exception)e.ExceptionObject;
   ILog log = LogManager.GetLogger(typeof(Program));
   log.Error(ex.Message + "\n" + ex.StackTrace);
}

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
   Exception ex = default(Exception);
   ex = e.Exception;
   ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET
   log.Error(ex.Message + "\n" + ex.StackTrace);
}

Трассировка стека вы можете получить с помощью exception.StackTrace

Ответ 2

Если бы я был вами, я бы рассмотрел решение "все-в-одном", например, бесплатную инфраструктуру NBug с открытым исходным кодом,

http://nbug.codeplex.com/

Ответ 3

Взгляните на Crypto Obfuscator, у которого есть функция Автоматическая публикация исключений.

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

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю в LogicNP Software, разработчике Crypto Obfuscator.

Ответ 4

Если вы завершаете свой код в try-catch и возникает Exception, вы можете получить в Exception, чтобы увидеть трассировку стека. Да, вы бы добавили try-catch, чтобы обернуть основную точку входа.

try
{
    MainEntryPoint();
}
catch (Exception exc)
{
   System.Diagnostics.Debug.Print(exc.Message);  // get at entire error message w/ stacktrace
   System.Diagnostics.Debug.Print(exc.StackTrace);  // or just the stacktrace
}