【问题标题】:Application crashes with "... stopped working" when brought to foreground应用程序在进入前台时崩溃并显示“...停止工作”
【发布时间】:2015-07-16 12:32:12
【问题描述】:

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

这个工具基本上是一个基于 .NET-Framework 4 的 WinForms 应用程序。它一般工作正常,但以下情况会导致随机崩溃:

如果程序在后台(没有焦点)并在一段时间后被用户带到前台(焦点/激活),它会崩溃并显示消息“工具名称已停止工作” .

如果在调试器下执行,ToolName 将替换为“vshost.exe”。 没有显示其他错误消息。不知道是哪一行代码导致了错误。

一些附加信息:

  • 如果我尝试通过激活窗口来强制出现此错误,然后激活另一个窗口(例如 Outlook),然后再次激活我的工具的窗口,这将很少会导致工具崩溃(必须有一些其他的杠杆作用)。李>
  • 除了 Form_LoadForm_SizeChanged 之外,MainForm 没有指定的事件处理程序
  • 该应用程序使用 WeifenLuo-Docking-Library 和 ZedGraph-Library。
  • 我的印象是只有在应用程序运行一段时间后才会出现此错误。
  • 崩溃至少出现在两台运行 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.Run 周围添加了一个 try-catch-Block,它也不会触发:

try
{
   Application.Run(new MainForm());
}
catch (Exception e)
{
   MessageBox.Show(e.Message);
}

【问题讨论】:

    标签: c# winforms crash


    【解决方案1】:

    当我遇到此类问题时,我通常从事件查看器开始。 Windows 会将应用程序崩溃记录到事件查看器中,即使它们是静默的。有时,它能够吐出一个堆栈跟踪,这可以使事情变得更容易。根据我的经验,该应用程序正在静默崩溃,因为它正在尝试加载一些缺少的依赖项并且它正在获取 TypeInitializationException。

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

    您使用的是什么版本的 Visual Studio?您的项目文件是否设置为 .NET 4?附加到流程时,您可以选择附加的代码类型。在“附加到进程”对话框中,按“附加到”右侧的“选择”(默认应为“自动:本机代码”)。然后选择所需的代码类型。对于 VS 2010 和 2013,此选项位于同一位置。

    【讨论】:

    • 我试过 Visual Studio 2010 和 2013。项目文件设置为 .NET 4。应用程序使用问题中提到的第三方库(WeifenLuo-Docking 和 ZedGraph-Lib) .该应用程序正在正常启动,而不是最小化。没有自定义绘图。它永远不会在应用程序的第一次显示时崩溃,只有当它被最小化和恢复(至少!)一次。
    • 事件日志中有一些关于崩溃的信息(感谢提示)。它说在我忘记提及的外部本机 DLL 中有一些异常“0xc0000005”。不幸的是,我无权访问它的源代码。无论设置如何,Visual Studio 都不允许我调试崩溃的应用程序。只有一条消息相应地显示“无法连接到崩溃的应用程序”。
    • 好的,这更有意义。您是否能够一次提取一个第 3 方库,看看其中一个是否是罪魁祸首?我意识到这意味着您将需要删除一些功能,但这将帮助您消除一些可能性。通常,事件查看器将记录 2 项 .NET 崩溃,一项标记为错误,另一项标记为信息。检查它们以获取相关信息(堆栈跟踪、异常类型、导致问题的 dll 等)
    【解决方案2】:

    我摆脱了崩溃:

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

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

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

    从那以后我没有遇到任何崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多