情况:
我有一个广泛使用http连接的应用程序(流式传输应用程序),它应该全天候工作。确实如此。
然而,偶尔会出现因任何地方未被捕获的运行时错误而崩溃,并在事件日志之后转储:
Event Type: Error
Event Source: .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID: 5000
Date: 13.10.2010
Time: 11:02:30
User: N/A
Computer: STREAM01
Description:
EventType clr20r3, P1 streamsink.exe, P2 1.0.0.42484, P3 4c880fd9, P4 mscorlib, P5 2.0.0.0, P6 4add54dc, P7 344a, P8 21c, P9 system.io.ioexception, P10 NIL.
我的问题是:如何知道导致崩溃的代码行。我正在使用二进制文件部署.PDB,但是......怎么做?
目标是WIndows XP,Framework是2.0
编辑:
我已经实现了这个:
static public void InitializeExceptionHandler(string AppName) {
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException+=new UnhandledExceptionEventHandler(currentDomain_UnhandledException);
_appName=AppName;
}
不,它不起作用!
答案 0 :(得分:4)
在入口点(Main()或...)中注册当前域的未处理异常:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
在处理程序中实现日志记录:
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// log
}
应用程序仍会崩溃,但您将获得发生的事件和堆栈跟踪的完整记录。
<强>更新强>
根据您的更新,我建议您下载Windows http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx的调试工具,然后启用事后调试并确保创建故障转储(请参阅Windbg帮助文件中的启用事后调试部分) 并使用Windbg调试转储以找出崩溃的位置。
答案 1 :(得分:3)
也许这篇文章会有用A Simple Class to Catch Unhandled Exceptions in WinForms
更新:
非常奇怪..所以抓住ProcDump,编写批处理文件,并在看到错误消息时让客户运行它。获取转储并尝试通过WinDbg或VS 2010进行调查。Here了解更多信息。
同时检查:Creating and analyzing minidumps in .NET production applications。如果您是WinDbg新手,请查看Tess Ferrandez's blog
的另一种方式答案 2 :(得分:2)
每当发生异常时,您都可以使用Adplus自动保存minidump。有关详细信息,请参阅此问题:Fastest way to break in WinDbg for specific exception? .net 4.0 app.
答案 3 :(得分:1)
如果无法实现异常处理解决方案,您可以实现一些跟踪日志记录,以缩小代码中的位置以及导致异常的流。