应用程序崩溃时"...停止工作"到达前台时

Ste*_*zek 2 c# crash winforms

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

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

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

如果在调试器下执行,则ToolName将替换为"vshost.exe".没有显示其他错误消息.我不知道哪行代码会导致错误.

一些其他信息:

  • 如果我尝试通过激活窗口强制此错误,激活另一个窗口(例如Outlook),然后再次激活我的工具的窗口,这将很少崩溃该工具(必须有一些其他杠杆).
  • Form_LoadForm_SizeChanged之外,MainForm没有指定的事件处理程序
  • 该应用程序使用WeifenLuo-Docking-Library和ZedGraph-Library.
  • 我的印象是,只有应用程序运行一段时间才会出现此错误.
  • 崩溃至少出现在两台运行Windows 7 x64的计算机上.(到目前为止我还没有尝试过任何其他的)
  • 我无法在崩溃过程中附加一个debbuger(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);
}
Run Code Online (Sandbox Code Playgroud)

在我的解压缩中,我在Application.Run周围添加了一个try-catch-Block,它也不会触发:

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

Tom*_*Tom 5

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

如果没有关于应用程序的更多信息,我很难告诉你原因是什么.应用程序是否加载了任何第三方库?应用程序中发生的任何自定义控件绘图?我相信.NET延迟加载类型.如果在应用程序尝试绘制自身之前不需要类型,则在首次显示应用程序之前可能不会加载它.此时,如果缺少类型,应用程序将崩溃.应用程序是否开始最小化?崩溃是随机的还是一致的?这意味着,如果您在启动时显示应用程序,它是否有效?或者,当您第一次显示应用程序时它是否总是崩溃?

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