当程序崩溃而不显示错误时如何确定问题?
-
18-09-2019 - |
题
请让我知道当我的应用程序崩溃并关闭并显示包含“不发送”和“发送错误报告”按钮的对话框时,我需要执行哪些步骤。
除了查看事件查看器来解决此问题之外,我还能做什么?
谢谢
解决方案
你可以添加一个
try/catch/finally
构造你的周围Main()
项的方法的主体。它的,你可以添加一个
ThreadException
处理程序,只是之前的应用程序。运行(),赶上的例外情况扔在它UI事件处理程序:Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
所有其他未处理的例外情况可以抓到了使用:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
但值得一提的是,这只允许登录/报告异常-你不能阻止应用程序关闭一旦你退出这个最后的处理程序。
Visual Studio还可配置到 打破在例外情况的第一次机会, 和外部调试器(如WinDbg管理SoS扩展)可以赶上第一机会的例外情况太(http://www.codeproject.com/KB/debug/windbg_part1.aspx).
此外,使用一种日志框架喜欢log4net添加有记录到应用和转的异常信息之前的应用程序关闭。
其他提示
问问你的用户,如果他们能重现错误,以及如何。如果你能重现错误,运行在Visual Studio调试,并按照相应的步骤导致崩溃。它捕获错误Visual Studio将进入调试模式。形成有,你将能够跟随堆栈跟踪,看看哪些代码导致错误。 Visual Studio中使得调试非常简单的大部分时间。
“发送/不发送”错误往往当你有在后台线程未处理的异常情况发生(主线程将表明继续/退出.NET对话框堆栈跟踪)。
添加一个异常处理程序到你的线程的功能,并从那里登陆:
void RunMyThread()
{
try
{
// background thread code
}
catch (Exception ex)
{
// Log the exception
}
}
这是高度简化的,并且可能不是你想怎么处理异常。但希望这将让你在正确的方向前进。
使用WinDbg调试问题。你可以把它打破(如停止在断点处)时,抛出一个异常,然后检查堆栈跟踪...的范围对象等等......
如果它发生在一个客户的网站,是不容易的开发一个调试器内可再现的,你可以做一些验尸调试。我喜欢用用户转储收集内存转储文件(.DMP)。然后,我使用WinDbg用于分析。