应用程序崩溃";…停止working"当被带到前台时

本文关键字:quot 前台 停止 崩溃 应用程序 working | 更新日期: 2023-09-27 18:02:57

我最近接到一个请求,要修复一个工具中的错误,这个工具是由一个离开公司的同事创建的。

这个工具基本上是一个基于。net framework 4的winforms应用程序。一般情况下它可以正常工作,但以下情况将导致随机崩溃:

如果程序在后台(没有焦点),并在一段时间后被用户带到前台(聚焦/激活),它崩溃并提示"ToolName已停止工作"

ToolName被替换为"vshost.exe",如果它在调试器下执行。没有显示额外的错误信息。我不知道是哪一行代码导致了这个错误。

一些附加信息:

  • 如果我试图通过激活窗口来强制此错误,激活另一个窗口(例如Outlook),然后再次激活我的工具的窗口,这将很少崩溃的工具(必须有一些其他杠杆)。MainForm没有指定的事件处理程序,除了Form_LoadForm_SizeChanged
  • 应用程序使用微网罗对接库和zedgraph库。
  • 我的印象是这个错误只有在应用程序运行了一段时间后才出现。
  • 至少在两台运行Windows 7 x64的计算机上出现崩溃。(到目前为止我还没有尝试过其他任何方法)
  • 我不能在崩溃过程中附加调试器(Visual Studio 2010和2013都不能工作!)。我得到消息

"当前调试器被配置为调试使用Microsoft . net Framework v 1.0、1.1或2.0的代码。. net Framework v4.0代码抛出了一个未处理的异常。"

我试图通过添加全局异常处理程序来获取更多关于崩溃的信息,这些异常处理程序应该创建一个带有堆栈跟踪的MessageBox,但它们不触发:

[STAThread]
static void Main()
{
  AppDomain currentDomain = default(AppDomain);
  currentDomain = AppDomain.CurrentDomain;
  currentDomain.UnhandledException += GlobalUnhandledExceptionHandler;
  System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler;
  // ...
}
private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
  Exception ex = default(Exception);
  ex = (Exception)e.ExceptionObject;
  MessageBox.Show(ex.Message + "'n" + ex.StackTrace);
}
private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
  Exception ex = default(Exception);
  ex = e.Exception;
  MessageBox.Show(ex.Message + "'n" + ex.StackTrace);
}
在我的绝望中,我在Application周围添加了一个try-catch块。
try
{
   Application.Run(new MainForm());
}
catch (Exception e)
{
   MessageBox.Show(e.Message);
}

应用程序崩溃";…停止working"当被带到前台时

当我遇到这样的问题时,我通常从事件查看器开始。Windows将把应用程序崩溃记录到事件查看器中,即使它们是沉默的。有时,它能够吐出堆栈跟踪,这可以使事情变得更容易。从我的经验来看,应用程序正在无声地崩溃,因为它试图加载一些缺失的依赖项,并且它正在获得TypeInitializationException。

如果不了解更多关于应用程序的信息,我很难告诉你根本原因是什么。应用程序是否加载任何第三方库?任何自定义控件绘图发生在应用程序?我相信。net延迟加载类型。如果在应用程序尝试绘制自己之前不需要类型,则可能在应用程序第一次显示之前不会加载该类型。此时,如果缺少该类型,应用程序将崩溃。应用程序是否开始最小化?崩溃是随机的还是一致的?意思是,如果你在启动时显示应用程序,它能工作吗?或者它总是崩溃当你第一次显示应用程序?

你使用的是什么版本的Visual Studio ?你的项目文件设置为。net 4吗?您可以在附加到进程时选择要附加的代码类型。在"附加到进程"对话框中,按"附加到"右侧的"选择"(默认应为"自动:本机代码")。然后选择所需的代码类型。

我摆脱了崩溃:

应用程序创建了一个用本地语言实现的第三方COM-Object实例。这个实例是在一个线程中创建的(可能是为了避免在主线程上创建时会出现Loader Lock-Error)。

在事件日志(在控制面板中找到)中有更多关于崩溃的信息。有一个关于导致崩溃的DLL名称的提示(感谢Tom的提示!)。

我将com对象的创建从早期绑定(通过dynamic和Activator.CreateInstance())更改为后期绑定(我在Visual Studio中添加了对com对象的引用)。这允许我在启动期间在主线程上创建com对象的实例。

从那以后我再也没有遇到过任何崩溃