C# 简单事故报告?

C# 简单事故报告?,c#,crash-reports,C#,Crash Reports,我正在研究在我的应用程序上实现一个简单的崩溃报告,该报告将询问用户是否希望将崩溃日志发送给我们 我以前从未做过崩溃报告,我习惯于尝试将错误保存到日志文件中 实施碰撞报告系统的正确方法是什么? 当应用程序崩溃时,如何触发崩溃报告以打开并发送转储,或者正确的发送数据方法是什么? 我认为以上是我最大的疑问,关于它如何工作或应该如何工作。。。我不完全确定当上述情况发生时,崩溃报告是否是try/catch与触发的外部应用程序的交互,或者正确的方法是什么 我没有可用的SQL Server,因此我计划使用一个

我正在研究在我的应用程序上实现一个简单的崩溃报告,该报告将询问用户是否希望将崩溃日志发送给我们

我以前从未做过崩溃报告,我习惯于尝试将错误保存到日志文件中

  • 实施碰撞报告系统的正确方法是什么?

  • 当应用程序崩溃时,如何触发崩溃报告以打开并发送转储,或者正确的发送数据方法是什么?

  • 我认为以上是我最大的疑问,关于它如何工作或应该如何工作。。。我不完全确定当上述情况发生时,崩溃报告是否是try/catch与触发的外部应用程序的交互,或者正确的方法是什么

    我没有可用的SQL Server,因此我计划使用一个简单的上载脚本,报告转储的应用程序将使用该脚本发送数据

    请原谅我对撞车报告工作原理的无知,我希望社区能帮助我更好地理解它。


    我在四处搜索坠机报告,看到了Crystal report、ready to go libraries的大部分内容,等等,但我想从小的角度开始,这样我可以在深入研究某个大型库或其他解决方案之前更好地了解它(如果在我这边可用)。

    尝试使用AppDomain.UnHandledException和/或AppDomain.ThreadException

    您考虑过使用内置的吗

    您可以使用Winqual网站 查看特定于驱动程序的, 特定于应用程序或操作系统 与关联的系统特定错误 你的组织。每个错误报告 提供了与此相关的详细信息 bucket,然后您可以请求 关联数据的文件

    要查看错误报告,请执行以下操作:

  • 建立一个Winqual帐户。保护公司不被冒充 并确保错误报告 去找一位来自世界各地的代表 正确的公司,Winqual网站 要求您的公司具有有效的 VeriSign ID
  • •与您的法律部门核实; 您的公司可能已经有了 VeriSign ID(也称为软件 发布者的数字标识,用于 验证码)检查Winqual 看看你的公司是否已经有了 帐户

  • 接受Windows错误报告协议

  • 登录Winqual站点

  • 单击Windows错误报告


  • 这篇老文章可能很有趣:

    很大程度上取决于应用程序,尤其是用户预期的隐私问题

    假设这是一个运行在用户PC上的客户端应用程序,如果这是一个“intranet”内部应用程序,那么在应用程序退出时让应用程序通过电子邮件将日志文件发送给您应该非常简单

    这可能非常有趣,因为有时您会在用户开始报告错误之前修复错误

    或者,如果您担心应用程序可能崩溃,并且无法正确捕获未处理的异常,您可以

  • 启动时,编写一个注册表项(或虚拟文件项,或您所拥有的内容),标记“应用程序未正确终止”
  • 在一个干净的出口上,清理注册表项(或您拥有的东西)
  • 启动时,检查注册表项(等)是否存在
    如果标记存在,则您知道应用程序以不干净的方式崩溃,因此您可以用文本提示用户,例如:“上次运行此程序时,它似乎没有正确退出。是否要发送一份发生在我们身上的事件日志,以便我们尝试修复可能发生的任何问题?”滚动您自己的异常处理程序。在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);
                }
            }
        }
    }
    
    使用系统;
    使用System.Windows.Forms;
    Net系统;
    使用System.Net.Mail;
    使用系统线程;
    命名空间异常HandlerTest
    {
    静态类程序
    {
    /// 
    ///应用程序的主要入口点。
    /// 
    [状态线程]
    静态void Main()
    {
    Application.ThreadException+=
    新ThreadExceptionEventHandler(应用程序\u ThreadException);
    //设计器生成的命令。
    }
    静态无效应用程序\u ThreadException(对象发送方,ThreadExceptionEventArgs e)
    {
    var fromAddress=新邮件地址(“您的Gmail地址”、“您的姓名”);
    var toAddress=新邮件地址(“您希望接收报告的电子邮件地址”、“您的姓名”);
    const string fromPassword=“您的密码”;
    const string subject=“异常报告”;
    异常=e.异常;
    字符串正文=exception.Message+“\n”+exception.Data+“\n”+exception.StackTrace+“\n”+exception.Source;
    var smtp=新SmtpClient
    {
    Host=“smtp.gmail.com”,
    端口=587,
    EnableSsl=true,
    DeliveryMethod=SmtpDeliveryMethod.Network,
    UseDefaultCredentials=false,
    凭据=新网络凭据(fromAddress.Address,fromPassword)
    };
    使用(var message=新邮件消息(fromAddress,toAddress)
    {
    主语,
    身体
    })
    {
    //您还可以使用SendAsync方法而不是Send,这样应用程序就可以开始调用,而不是等待发送邮件完成:-将指定的电子邮件发送到SMTP服务器进行传递。此方法不会阻止调用线程,并允许调用方将对象传递给操作完成时调用的方法。
    smtp.Send(message);
    }
    }
    }
    }
    
    你可以通过撞车来节省时间