我正在考虑在我的应用程序上实现一个简单的崩溃报告,该报告会询问用户是否要将崩溃日志发送给我们。
之前我从未做过崩溃报告,我以前做的是尝试/捕获将错误保存到日志文件。
实施崩溃报告系统的正确方法是什么?
如何在应用程序崩溃时触发崩溃报告以打开并发送转储,或者发送数据的正确方法是什么?
我认为以上是我对其工作原理或应该如何工作的最大疑问......我不完全确定崩溃报告是否会在上述发生或触发时触发外部应用程序的尝试/捕获将是遵循它的正确方法。
我没有SQL Server可用,所以我打算使用的是一个简单的上传脚本,报告转储的应用程序将用于发送数据。
请原谅我对崩溃报告如何运作的无知,我希望社区可以帮助我更好地理解它。
我正在搜索崩溃报告,看到大多数事情围绕Crystal Report,准备去图书馆等,但我想小一点,所以我可以在深入了解一些大型图书馆或其他之前更好地了解它解决方案,如果它在我的最后可用。
答案 0 :(得分:6)
您是否考虑过使用内置Windows Error Reporting?
您可以使用Winqual网站 查看驱动程序特定的, 特定于应用程序或运行 系统特定的错误与 你的组织。每个错误报告 提供与此相关的详细信息 桶,你可以请求一个 相关数据的文件。
查看错误报告:
- 建立Winqual帐户。保护公司免受冒充 并确保错误报告 去找一位代表 正确的公司,Winqual网站 要求贵公司有效 VeriSign ID。
醇>•咨询您的法律部门; 你的公司可能已经有了 VeriSign ID(也称为软件 发布者的数字身份证 验证码)。 •检查Winqual 看你的公司是否已经有了 帐户。
接受Windows错误报告协议。
登录Winqual网站。
- 醇>
单击“Windows错误报告”。
这篇旧文章可能很有用:A Simple Class to Catch Unhandled Exceptions in WinForms
答案 1 :(得分:4)
很大程度上取决于应用程序和(特别是)用户预期的隐私问题。
假设这是在用户PC上运行的客户端应用程序,如果这是一个“内部网”内部应用程序,则应用程序退出时应用程序会将日志文件通过电子邮件发送给您,这应该非常简单。
这可能非常有趣,因为有时您会在用户报告之前修复错误。
或者,如果您担心应用程序可能崩溃并且无法正确捕获未处理的异常,您可以
如果标记存在,那么您知道应用程序以非干净的方式崩溃,因此您可以提示用户输入文本,例如“上次运行此程序时,它似乎没有正确退出。您是否要发送我们发生的事情的日志,以便我们可以尝试解决可能发生的任何问题?”
答案 2 :(得分: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);
}
}
}
}
获取崩溃报告库来节省您的时间
答案 3 :(得分:1)
尝试使用AppDomain.UnHandledException和/或AppDomain.ThreadException