我们有一个使用Visual Studio 2010开发的基于.NET的Windows应用程序。此应用程序是使用.NET Framework 2.0的目标框架构建的。我们将使用.NET 3.5 SP1作为工作平台(先决条件)运送该应用程序。总的来说,这个应用程序与我们的大多数客户一直运行良好。但其中一人目前遇到了问题。应用程序不时遇到致命错误(间歇性地)并被迫关闭而不会抛出任何错误消息,除了“应用程序遇到问题并需要关闭。我们很抱歉给您带来不便。”我们可以获得的唯一信息来自Windows事件查看器。错误详情如下:
来源:.NET Runtime 2.0错误
EventType:clr20r3,
P1:App.exe
P2:6.0.0.0
P3:4dee1ecd
P4:system.windows.forms
P5:2.0.0.0
P6:4889 dee7
P7:16cf
P8:159
P9:system.componentmodel.win32
P10:NIL
当应用程序崩溃时,用户正在执行不同的操作。我们使用Windows XP Professional设置了一个虚拟机,这是我们客户使用的操作系统。在测试环境中,一切都运行良好。我们永远无法复制这个问题。
任何团体都有任何想法或想法?
任何评论都非常感谢。
答案 0 :(得分:2)
我看到当Windows窗体应用程序遇到消息泵的未处理错误消息时,在事件日志中出现此错误(或者至少有一个与此类似的错误) - 您应该检查以确保您的Main
方法和所有后台线程都有try-catch块,(或者您处理UnhandledException
事件):
[STAThread]
static void Main()
{
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
catch (Exception ex)
{
// Log me
}
}
请注意,在发布的示例中,通常不会使用上面的catch
块,因为这些方法通常不会抛出异常,但是如果您更改了UnhandledExceptionMode
或执行了任何可能抛出的操作消息泵之外的例外,这可能会给你你所看到的行为。
答案 1 :(得分:2)
不要依赖Windows日志。相反,你自己的错误;你可以做的是处理应用程序抛出的任何异常,记录它,然后重新启动你的应用程序:
所以在你的主要:
AppDomain.CurrentDomain.UnhandledException += OnCurrentDomain_UnhandledException;
//Add these too if you are in windows forms application
Application.ThreadException += OnApplication_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
然后,如果抛出异常只需记录它,您也可以重新启动应用程序
private static void OnCurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
#if DEBUG
System.Diagnostics.Debugger.Break();//we will break here if we are in debug mode.
#endif//DEBUG
LogException(e);//maybe send email to you also.
RestartTheApplication();
}