2010-10-30 3 views
2

Я установил приложение Windows Forms .NET 3.5 и установил его правильно. При попытке запустить приложение аварийно завершает работу и появляется типичное диалоговое окно с ошибкой Microsoft Windows. Вы знаете тот, который просит вас отправить отчет об ошибке.Как увидеть исключение приложения при работе на клиентской машине?

Мой вопрос: как я могу узнать, что на самом деле заставило программу не запускать?

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

Есть ли способ увидеть «внутреннее исключение», когда он не работает на машине разработки?

ответ

1

Эти опции по умолчанию у вас есть:

  1. (если это возможно) изменить программу так, чтобы она регистрирует ошибки и предупреждения, используя, например, log4net или журнал событий Windows, затем перераспределите приложение.
  2. Если первый вариант невозможен, вам нужно будет проверить более совершенную отладку: отладка во время выполнения на клиентской машине. Один из способов - использовать WinDbg с расширениями .NET (SOS) или соответствующими инструментами от Debugging Tools for Windows. Вы можете настроить его на клиентской машине без запуска установщика, поэтому он должен иметь небольшие или никакие побочные эффекты (в отличие от отказа от настройки Visual Studio). Одна статья об этом - here, где они отлаживают файл дампа сбоя. Here - еще одна статья по этой теме. Вы найдете бесконечные ресурсы в этом googling - тема не проста, но я рекомендую вам заглянуть в нее.

(Если вам нужны результаты сейчас, и не имеют времени, чтобы копаться в продвинутой отладки с помощью WinDbg и связанных с ними инструментов в данный момент, я бы просто добавить некоторые трассировки в приложение.)

0

ли вы проверяете EventLog? Если ваша программа запустится, а затем начните сбой. поставьте EventLog.WriteEntry (exceptionMessage). Если нет, лучший способ увидеть это EventLog.

2

Помимо проверки средства просмотра событий Windows (из управления компьютером) вы также можете попытаться создать некоторую ошибку в вашей программе. Если вы расширяете свой метод Main() содержать следующие строки, которые вы сможете получить дополнительную информацию о причине сбоя программы:

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    Application.Run(new Form1()); 
} 

private static void Application_ThreadException(
     object sender, ThreadExceptionEventArgs e) 
{ 
    //Log error here using e.Exception 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    //Log error here using (Exception)e.ExceptionObjecte.Exception 
} 

Вы могли бы, например, зарегистрировать ошибку в простой текстовый файл, используя StreamWriter :

string dateStr = DateTime.Now.ToString("yyyy-MM-dd"); 
StreamWriter sw = File.AppendText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ErrorLog_" + dateStr + ".log")); 
sw.WriteLine(exception); 
Смежные вопросы