如何找出我的应用“停止工作”的原因?

时间:2011-07-19 21:58:38

标签: .net windows-7

我的应用程序适用于我的计算机。但另一个用户(也可以在他的机器上使用它)说它在服务器机器上对他不起作用。但服务器只是说“程序名称已停止工作”。有一个“查看问题详细信息”命令,但它没有告诉我足够的信息:

Problem signature:
  Problem Event Name:                        CLR20r3
  Problem Signature 01:                       programname.exe
  Problem Signature 02:                       0.0.0.0
  Problem Signature 03:                       4e20a786
  Problem Signature 04:                       mscorlib
  Problem Signature 05:                       2.0.0.0
  Problem Signature 06:                       4d8c1599
  Problem Signature 07:                       f9b
  Problem Signature 08:                       80
  Problem Signature 09:                       System.IO.FileNotFoundException
  OS Version:                                          6.1.7600.2.0.0.16.7
  Locale ID:                                             1033

Main()的第一行安装了一个“未处理的异常处理程序”,它应该显示一个带有堆栈跟踪的窗口。它一直运作到现在。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
Application.ThreadException += ShowUnhandledException;

有什么方法可以获得一个调用堆栈吗?附:我需要在接下来的一个小时内完成;)

3 个答案:

答案 0 :(得分:3)

  

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);

仅捕获并显示由于在UI线程上运行的事件处理程序而发生的异常。它不能替代AppDomain.CurrentDomain.UnhandledException,即代码在工作线程崩溃时运行的事件。

但是你发布的跟踪为另一个问题提供了一些可能性:你的代码在开始之前可能会崩溃。 System.IO.FileNotFoundException是在您未确保客户端计算机上安装了正确版本的.NET时引发的异常。使用安装和部署项目轻松处理。或者让您的朋友启用Windows Update。

答案 1 :(得分:1)

创建一个新项目。添加对实际项目的引用。在您的应用程序中,您可以使用Assembly.Load(“..”)方法加载其他项目,这可以在try..catch块中完成。由于CLR会进行JIT编译,因此您的新应用程序应该启动(除非出现问题不是特定于所讨论的特定应用程序,而是与您的默认项目设置有关)并且在它启动后它应该能够捕获任何导致另一个失败的堆栈跟踪。以某种方式捕获此文件(文件,电子邮件,数据库)并让其他用户获得此输出。

至少这是我的理论。我没有任何程序不会开始测试这个。至少不是你给出的时间范围。

PS ==>如果您的包装应用程序无法启动,请尝试创建一个简单的“Hello world”控制台应用程序,看看是否会启动。尝试针对不同的.NET框架。创建几个这样的小应用程序来测试不同的设置。也许您的目标是64位平台,服务器是32位?

编辑:不确定如何使这项工作,因为当您将项目引用添加到可执行的程序集时,它似乎不会创建带有第二个程序集的构建的.exe文件。所以看起来你只需要从其他安装中加载来自文件系统的可执行文件......

答案 2 :(得分:1)

原来我的安装程序(MSI)在某些时候被破坏了,并且没有包含我的程序使用的7个DLL中的2个。

仍然不清楚为什么ThreadException处理程序不起作用(.NET应该调用Main(),即使DLL丢失了,因为.NET按需加载依赖项,而AFAIK只有UI线程正在运行;但是因为它已经修复了,所以没有进一步调查。)