1

我有一个由 C# 开发并由 .net 4.0 构建的程序。该程序是一个 Windows 客户端,它将从条形码阅读器(通过 com 端口)读取条形码,然后通过 WCF 将条形码发送到后端服务器。客户在客户端操作系统中有一个脚本,它将重新启动操作系统并每天自动启动我的程序。操作系统是 Windows XP Embedded。

现在的问题是,有时当系统重新启动时,我的程序无法启动,并且会弹出一个错误消息框询问是否将此错误报告发送给微软。最奇怪的是,如果我的同事将程序文件夹复制并粘贴为“...的副本”在与原始文件夹相同的文件夹中,“...的副本”下的exe可以毫无问题地运行。但原来的还是不行。

我的猜测是,当系统被迫重新启动时,程序可能正在写入日志和其他记录文件。并且文件获得未释放的读/写锁。

我已将错误屏幕截图上传到 flickr。请点击这里链接访问。

4

3 回答 3

1

在不知道实际异常是什么的情况下,我们只能猜测。

您将需要捕获应用程序中引发的异常。

最佳实践是将代码封装在 try/catch 子句中。

如果您仍然遇到应用程序崩溃,则可以将事件处理程序附加到 AppDomain.UnhandledExceptionApplication.UnhandledException并记录收到的异常。

确保输出整个异常堆栈跟踪,以便您可以看到它是从哪里抛出的。

一旦你得到了异常,如果你不能找出原因,然后在这里问另一个问题,具体细节。例如:“在 Windows XP Embedded 上启动后调用 Bar() 时抛出 FooException”

于 2012-05-17T04:37:47.420 回答
0

参考您发布的图像 IMG_1348,错误会在您的表单构造函数中引发。

似乎您添加的代码或 InitializeComponent 代码正在抛出。

由于您使用的是 XPe,因此您可以使用一些选项来调试此问题:

  1. 在各种构造函数周围添加消息框语句以显示初始化进度。前后守护。

    public Form1() { MessageBox.Show("Before InitializeComponent"); 初始化组件();MessageBox.Show("初始化组件后");

    //MessageBox.Show("在其他之前"); //其他初始化代码 //MessageBox.Show("After Other"); }

  2. 尝试使用远程调试器。我不确定这是否适用于 XPe,但如果可以,并且由于您的代码在构造函数中抛出,您需要添加代码以等待调试器连接。

    public Form1() { while (!System.Diagnostics.Debugger.IsAttached){ System.Threading.Thread.Sleep(0); } InitializeComponent(); //其他初始化代码 }

于 2012-05-17T05:03:23.540 回答
0

有时在重新启动后,某些设备驱动程序或某些硬件不会自行重置。必须重新启动机器(关闭并重新打开),或者需要发现将强制设备驱动程序和/或硬件重置的命令。

于 2012-05-17T03:50:55.567 回答