【问题标题】:How to see the exception of an application when running on client machine?在客户端机器上运行时如何查看应用程序的异常?
【发布时间】:2010-10-31 23:09:19
【问题描述】:

我安装了我的 Windows Forms .NET 3.5 应用程序并且它安装正确。尝试运行它时,应用程序崩溃并显示典型的 Microsoft Windows 错误对话框。您知道要求您发送错误报告的那个。

我的问题是,我如何才能看到导致程序启动失败的真正原因?

应用程序在我的开发机器上运行良好,问题是在安装了我创建的安装文件时在另一台计算机上运行。

当不在开发机器上运行时,有没有办法查看“innerException”?

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    除了检查 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);
    

    【讨论】:

      【解决方案2】:

      这些是您拥有的默认选项:

      1. (如果可能)更改应用程序以记录错误和警告,例如使用log4net 或 windows 事件日志,然后重新分发您的应用。
      2. 如果第一个选项不可行,您必须检查更高级的调试:客户端计算机上的运行时调试。一种方法是将 WinDbg 与 .NET 扩展 (SOS) 或来自Debugging Tools for Windows 的相关工具一起使用。您可以在客户端计算机上设置它而无需运行安装程序,因此它应该有很少或没有副作用(与设置 Visual Studio 的非选项相反)。关于这方面的一篇文章是here,他们正在调试故障转储文件。 Here 是关于该主题的另一篇文章。你会在这个谷歌上找到无穷无尽的资源——这个话题并不简单,但我建议你研究一下。

      (如果您现在需要结果,并且目前没有时间深入使用 WinDbg 和相关工具进行高级调试,我会在应用程序中添加一些跟踪。)

      【讨论】:

        【解决方案3】:

        您检查过事件日志吗?如果你的程序启动了,那么就开始崩溃。把 EventLog.WriteEntry(exceptionMessage)。如果没有,最好的查看方式是 EventLog。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-30
          • 2022-11-30
          • 2012-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多