我最近得到了一个工具的修复错误的请求,该工具是由一个离开公司的同事创建的.
这个工具基本上是一个基于.NET-Framework 4的WinForms应用程序.它一般工作正常,但以下情况会导致随机崩溃:
如果程序在后台(没有焦点)并且在一段时间后被用户带到前台(聚焦/激活),则它会在消息"ToolName已停止工作"时崩溃.
如果在调试器下执行,则ToolName将替换为"vshost.exe".没有显示其他错误消息.我不知道哪行代码会导致错误.
一些其他信息:
"当前的调试器配置为调试使用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)
当我遇到这样的问题时,我通常从事件查看器开始.Windows会将应用程序崩溃记录到事件查看器,即使它们是静默的.有时,它能够吐出堆栈跟踪,这可以使事情变得更加容易.根据我的经验,应用程序正在静默崩溃,因为它正在尝试加载一些缺少的依赖项,并且它正在获取TypeInitializationException.
如果没有关于应用程序的更多信息,我很难告诉你原因是什么.应用程序是否加载了任何第三方库?应用程序中发生的任何自定义控件绘图?我相信.NET延迟加载类型.如果在应用程序尝试绘制自身之前不需要类型,则在首次显示应用程序之前可能不会加载它.此时,如果缺少类型,应用程序将崩溃.应用程序是否开始最小化?崩溃是随机的还是一致的?这意味着,如果您在启动时显示应用程序,它是否有效?或者,当您第一次显示应用程序时它是否总是崩溃?
您使用的是哪个版本的Visual Studio?您的项目文件是否设置为.NET 4?您可以选择附加到流程时要附加的代码类型.在"附加到进程"对话框中,按"附加到"右侧的"选择"(默认值应为"自动:本机代码").然后选择所需的代码类型.此选项与VS 2010和2013位于同一位置.
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |