2010-12-12 5 views
5

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

Раньше я никогда не делал отчета о сбоях, то, что я привык делать, - это попытка/уловка, сохраняющая ошибки в файле журнала.

  1. Что такое правильный способ реализации системы отчетов аварии?

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

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

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

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

Я искал информацию о краш-отчете и видел, как большинство вещей идет вокруг Crystal Report, готовых пойти на библиотеки и т. Д., Но я бы хотел начать его с малого, чтобы лучше понять его, прежде чем врываться в какую-то большую библиотеку или другое решение, если оно доступно в моем конце.

ответ

3

Многое зависит от применения и (в частности) предполагаемые приватность опасения пользователей.

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

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

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

  1. При запуске, запись записи реестра (или запись фиктивного файла, или что -have-you), который отмечает, что «приложение не прекращено должным образом»
  2. На чистом выходе очистите запись в реестре (или что-нибудь еще)
  3. При запуске проверьте, не указана ли запись в реестре (и т. д.).) существует.

Если маркер присутствует, вы знаете, что приложение разбито нечистым способом, поэтому вы можете запросить у пользователя текст, например. «В прошлый раз, когда вы запускали эту программу, она не отображалась правильно. Не хотите ли вы отправить журнал того, что произошло с нами, чтобы мы могли исправить любую проблему, которая могла произойти?»

+0

+1 для ответа. Я не хочу собирать информацию о пользователях, так как он работает, все, что я хочу, это то, что он отправляет мне отчет о сбое, когда он падает, и, прежде чем делать это, он попросит пользователя, хотят ли они этого или нет. Ваш второй момент кажется идеей, которая будет работать для меня в момент.Но что, если программа даже не запускается для пользователя по причине N, которая не обрабатывается, и мне нужен отчет о сбое, чтобы исследовать его? – Prix

+0

Ответ mitch был хорошим, но winqual не применим ко мне, и 2-я ссылка никогда не работала, кроме того, этот ответ мне подходил лучше, так как у меня не было другого ответа, который действительно и вызвал мой вопрос, поэтому я проверю это как свой ответ. – Prix

+1

Этот подход работает только для того, чтобы узнать, действительно ли приложение или не разбилось, не так ли? что, если я тоже хочу отправить исключение? более или менее похоже на Firefox. – Jack

1

Попробуйте использовать AppDomain.UnHandledException и/или AppDomain.ThreadException

+0

я буду читать о нем больше, чтобы увидеть, как это работает спасибо за ответ. – Prix

6

считается ли вы с помощью встроенного в Windows Error Reporting?

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

Для просмотра отчетов об ошибках:

  1. Установите Winqual счет. Чтобы защитить компании от олицетворения и обеспечить, чтобы сообщения об ошибках обратились к представителю от правильной компании, на веб-сайте Winqual требуется, чтобы ваша компания имела действительный идентификатор VeriSign .

• Обратитесь в юридический отдел; Возможно, у вашей компании уже есть идентификатор VeriSign (также называемый программным обеспечением Цифровой идентификатор издателя для Authenticode). • Проверьте на Winqual , чтобы узнать, есть ли в вашей компании учетная запись .

  1. Принять соглашение об Ошибке ошибок Windows.

  2. Войдите на сайт Winqual.

  3. Нажмите «Отчеты об ошибках Windows».

Эта старая статья может быть интересна: A Simple Class to Catch Unhandled Exceptions in WinForms

+0

Winqual классный, но это не очень помогает управляемым программам, не так ли? Я помню, что в основном это был основной код, а не управляемый. –

+0

О 'встроенной отчетности об ошибках Windows 'Это выглядит интересно, но это личное приложение не из организации/компании, оно по-прежнему может быть использовано для личного использования? – Prix

+0

Что касается второй ссылки, мне кажется, именно то, что я пытаюсь сделать в момент, я дам ей попробовать, спасибо. – Prix

4

Создайте собственный обработчик исключений. Используйте код ниже в вашем классе program.cs. Он автоматически отправит почту при возникновении исключения.

using System; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Mail; 
using System.Threading; 

namespace ExceptionHandlerTest 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.ThreadException += 
       new ThreadExceptionEventHandler(Application_ThreadException); 

      // Your designer generated commands. 
     } 

     static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) 
     { 

      var fromAddress = new MailAddress("your Gmail address", "Your name"); 
      var toAddress = new MailAddress("email address where you want to receive reports", "Your name"); 
      const string fromPassword = "your password"; 
      const string subject = "exception report"; 
      Exception exception = e.Exception; 
      string body = exception.Message + "\n" + exception.Data + "\n" + exception.StackTrace + "\n" + exception.Source; 

      var smtp = new SmtpClient 
      { 
       Host = "smtp.gmail.com", 
       Port = 587, 
       EnableSsl = true, 
       DeliveryMethod = SmtpDeliveryMethod.Network, 
       UseDefaultCredentials = false, 
       Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
      }; 
      using (var message = new MailMessage(fromAddress, toAddress) 
      { 
       Subject = subject, 
       Body = body 
      }) 
      { 
       //You can also use SendAsync method instead of Send so your application begin invoking instead of waiting for send mail to complete. SendAsync(MailMessage, Object) :- Sends the specified e-mail message to an SMTP server for delivery. This method does not block the calling thread and allows the caller to pass an object to the method that is invoked when the operation completes. 
       smtp.Send(message); 
      } 
     } 
    } 
} 

Вы можете сэкономить время, получая библиотеку отчетов аварии, основываясь на этом из https://crashreporterdotnet.codeplex.com

+0

Эта библиотека великолепна! благодаря! – Jack

Смежные вопросы