【发布时间】:2015-07-16 12:32:12
【问题描述】:
我最近收到了修复一个工具中的错误的请求,该工具是由一位离开公司的同事创建的。
这个工具基本上是一个基于 .NET-Framework 4 的 WinForms 应用程序。它一般工作正常,但以下情况会导致随机崩溃:
如果程序在后台(没有焦点)并在一段时间后被用户带到前台(焦点/激活),它会崩溃并显示消息“工具名称已停止工作” .
如果在调试器下执行,ToolName 将替换为“vshost.exe”。 没有显示其他错误消息。不知道是哪一行代码导致了错误。
一些附加信息:
- 如果我尝试通过激活窗口来强制出现此错误,然后激活另一个窗口(例如 Outlook),然后再次激活我的工具的窗口,这将很少会导致工具崩溃(必须有一些其他的杠杆作用)。李>
- 除了 Form_Load 和 Form_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);
}
【问题讨论】: