2012-04-18 280 views
14

我是C#的新手。我正在编写一个小型桌面表单应用程序,我需要在应用程序中使用此功能。在C#中如何收集程序崩溃的堆栈跟踪

如果在任何时候,应用程序崩溃,应该有应用程序,以收集堆栈跟踪并寄回给我最后一次机会......

请给我这个方向。

我是否需要一个覆盖主应用程序入口点的try catch?或者什么是在C#应用程序中处理这些事情的最佳方式。

谢谢你,

+2

“手机之家”程序的功能需要仔细设计。确保你提醒用户,并考虑你最好不要收到什么数据(密码,名字,如果它可以包含儿童信息,应极其小心)。检查出来 - [Windows错误报告:入门](http://msdn.microsoft.com/en-us/windows/hardware/gg487440),至少隐私链接。 – 2012-04-18 05:08:23

回答

22

要捕获所有未处理的异常,这种添加到Program.cs中:

[STAThread] 
    static void Main() 
    { 
    AppDomain currentDomain = default(AppDomain); 
    currentDomain = AppDomain.CurrentDomain; 
    // Handler for unhandled exceptions. 
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; 
    // Handler for exceptions in threads behind forms. 
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; 
    ... 
    } 

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = (Exception)e.ExceptionObject; 
    ILog log = LogManager.GetLogger(typeof(Program)); 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = e.Exception; 
    ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

堆栈跟踪您可以通过如果你包得exception.StackTrace

+2

感谢您的答案。我将你的答案与Lynn Crumbling的比较,我想知道这种方法与他的好处是什么? – Ahmed 2012-04-18 05:08:17

+4

@ user1185422 Aseem的方法是一个全局解决方案,它甚至可以捕获启动时间错误,.NET内部异常,异步操作错误等。Lynn的方法是本地方法,只会捕获从MainEntryPoint调用的方法中发生的异常* * **同步。我不会推荐Lynn的方法作为崩溃报告解决方案,因为您可能会错过整个类的错误。 – 2012-04-18 05:19:45

+2

尝试catch块是好的,但是将try-catch中的每一行代码包装起来可能会很乏味,而且由于第三方库可能会出现异常,所以这种方法也解决了这两个问题。你可以继续使用try-catch块的方法,即使这是绝对必要的。 – 2012-04-18 06:42:42

1

您try-catch中的代码,并且发生异常,您可以在Exception处查看堆栈跟踪。是的,你会添加一个try-catch来包装你的主入口点。

try 
{ 
    MainEntryPoint(); 
} 
catch (Exception exc) 
{ 
    System.Diagnostics.Debug.Print(exc.Message); // get at entire error message w/ stacktrace 
    System.Diagnostics.Debug.Print(exc.StackTrace); // or just the stacktrace 
} 
+0

我很想知道订阅UnhandledException对于使用这种方法有什么好处。 – 2012-04-18 05:02:18

+2

是的,我试图找到使用该方法的原因。它可能是捕捉应用程序中的其他非UI线程的例外吗?我不确定您的解决方案是否也会捕获其他线程的异常。 – Ahmed 2012-04-18 05:16:06

3

如果我是你,我会考虑的所有功能于一身的解决方案,如自由和开放源码NBug框架,

http://nbug.codeplex.com/

+0

使用其提供的示例花费了30分钟。即使示例配置应用程序也崩溃了很多..虽然这个想法似乎很棒.. – Ahmed 2012-04-18 06:33:51

3

看看加密混淆其中有一个Automatic Exception Reporting功能。

自动异常报告功能使您能够轻松捕获软件中发生的任何未处理的异常,并让用户只需单击一下按钮即可轻松向您报告这些异常。

异常报告包括所有相关信息,包括完整的堆栈跟踪信息以及所有方法参数和局部变量的值,以及系统信息,异常时间,内部版本号以及可选的开发人员定义的自定义数据日志文件,屏幕截图等。

免责声明:我为Crypto Obfuscator的开发人员LogicNP Software工作。

+1

还有其他类似的商业工具,比如Red-Gate的SmartAssembly,http://www.red-gate.com/products/dotnet-development/smartassembly/ :) – 2012-04-18 05:51:32