Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中如何收集程序崩溃的堆栈跟踪_C#_.net_Winforms_Error Handling - Fatal编程技术网

在C#中如何收集程序崩溃的堆栈跟踪

在C#中如何收集程序崩溃的堆栈跟踪,c#,.net,winforms,error-handling,C#,.net,Winforms,Error Handling,我是C#的新手。我正在编写一个基于桌面表单的小应用程序,我需要在应用程序中具有此功能 如果应用程序在任何时候崩溃,应用程序应该有最后一次机会收集堆栈跟踪并将其发送回我 请告诉我这方面的指示 我是否需要一个涵盖我的应用程序的主要入口点的尝试捕捉??或者,在C#app中处理此类事情的最佳方式是什么 谢谢,要捕获所有未处理的异常,请将以下内容添加到program.cs: [STAThread] static void Main() { AppDomain current

我是C#的新手。我正在编写一个基于桌面表单的小应用程序,我需要在应用程序中具有此功能

如果应用程序在任何时候崩溃,应用程序应该有最后一次机会收集堆栈跟踪并将其发送回我

请告诉我这方面的指示

我是否需要一个涵盖我的应用程序的主要入口点的尝试捕捉??或者,在C#app中处理此类事情的最佳方式是什么


谢谢,

要捕获所有未处理的异常,请将以下内容添加到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);
}

堆栈跟踪可以通过异常获取。如果将代码包装在try catch中,并且出现异常,则可以获取异常以查看堆栈跟踪。是的,您可以添加一个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
}

如果我是你,我会考虑一个一对一的解决方案,比如免费和开源的NBUG框架,


看看加密模糊器,它有一个功能

自动异常报告使您可以非常轻松地捕获软件中发生的任何未处理的异常,用户只需单击一个按钮即可轻松地向您报告这些异常

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


免责声明:我为LogicNP软件工作,该软件是加密模糊器的开发人员。

我想知道订阅UnhandledException比使用这种方法有什么好处。是的,我也在试图找到使用这种方法的原因。它是否可能捕获应用程序中其他非UI线程的异常?我不确定您的解决方案是否也捕获了其他线程的异常..谢谢您的回答。我将您的答案与Lynn Crumbling的进行比较,我想知道这种方法与他的相比有什么好处?@user1185422 Aseem的方法是一种全局解决方案,甚至可以捕获启动时错误、.NET内部异常、异步操作错误、,Lynn的方法是本地方法,只捕获从
MainEntryPoint
同步调用的方法内部发生的异常。我不推荐Lynn的方法作为崩溃报告解决方案,因为您可能会错过所有类的错误。try-catch块很好,但将每一行代码包装到try-catch中可能会很乏味,而且可能会由于第三方库而出现异常,这种方法也解决了这两个问题。您可以继续使用try-catch-block方法,即使这样,这也是绝对必要的。@Pavel和Aseem——谢谢您的解释。我以后会采用这种方法。谢谢你的回答。我试着在主线程中创建异常或手动设置线程,结果成功了,但是,当我在
System.Threading.Tasks.Dataflow
中定义的
ActionBlock
方法中发生异常时,程序不会抛出异常,也不会触发
currentDomain.UnhandledException
,控制台程序只是卡住了。程序的“呼叫总部”功能需要仔细设计。确保你警告用户并考虑哪些数据你最好不要接收(密码,名字,如果它能包含子信息,那么非常小心)。还有一些类似的商业工具,比如红门的SmartAssembly:)花了30分钟使用它提供的示例。。即使是示例配置应用程序也崩溃了很多。。不过这个主意似乎很棒。。