我最近收到了修复由一位离开公司的同事创建的工具中的错误的请求。
这个工具基本上是一个基于.NET-Framework 4的WinForms应用程序。它一般工作正常,但以下情况会导致随机崩溃:
如果程序在后台(没有焦点)并且在一段时间后被用户带到前台(聚焦/激活),它会在消息“ToolName已停止工作”时崩溃
如果在调试器下执行,则ToolName将替换为“vshost.exe”。 没有显示其他错误消息。我不知道代码的哪一行会导致错误。
其他一些信息:
“当前调试器配置为调试使用Microsoft .NET Framework v 1.0,1.1或2.0的代码。从.NET Framework v4.0代码中抛出未处理的异常。” < / p>
我尝试通过添加全局异常处理程序来获取有关崩溃的更多信息,这些异常处理程序应该创建一个带有堆栈跟踪的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);
}
答案 0 :(得分:5)
当遇到这样的问题时,我通常会从事件查看器开始。 Windows会将应用程序崩溃记录到事件查看器,即使它们是静默的。有时,它能够吐出堆栈跟踪,这可以使事情变得更加容易。根据我的经验,应用程序正在静默崩溃,因为它正在尝试加载一些缺少的依赖项,并且它正在获取TypeInitializationException。
如果没有关于该应用程序的更多信息,我很难告诉您根本原因。应用程序是否加载了任何第三方库?应用程序中发生的任何自定义控件绘图?我相信.NET延迟加载类型。如果在应用程序尝试绘制自身之前不需要类型,则在首次显示应用程序之前可能不会加载它。此时,如果缺少类型,应用程序将崩溃。应用程序是否开始最小化?崩溃是随机的还是一致的?这意味着,如果您在启动时显示应用程序,它是否有效?或者,当您第一次显示应用程序时它是否总是崩溃?
您使用的是哪个版本的Visual Studio?您的项目文件是否设置为.NET 4?您可以选择附加到流程时要附加的代码类型。在“附加到进程”对话框中,按“附加到”右侧的“选择”(默认值应为“自动:本机代码”)。然后选择所需的代码类型。对于VS 2010和2013,此选项位于同一位置。
答案 1 :(得分:1)
我摆脱了崩溃:
应用程序创建了以本机语言实现的第三方COM对象的实例。这个实例是在一个线程中创建的(可以避免 Loader Lock -Error,如果在主线程上创建的话会出现这个错误。)
在事件日志(在控制面板中找到)中有关于崩溃的更多信息。有一个提示导致崩溃的DLL名称(感谢Tom提示!)。
我将COM对象的创建从早期绑定(通过dynamic和Activator.CreateInstance())更改为后期绑定(我在Visual Studio中添加了对COM对象的引用)。这允许我在启动期间在主线程上创建COM对象的实例。
从那以后我没有经历任何崩溃。