C# 在.NET中处理未经处理的应用程序中止

C# 在.NET中处理未经处理的应用程序中止,c#,unhandled-exception,C#,Unhandled Exception,我知道我甚至问这个问题都是在向一个皇家火焰敞开心扉,但我想我会看看StackOverflow是否有任何解决我所遇到问题的方法 我有一个C#应用程序在客户端站点出现故障,无法在本地复制。不幸的是,我很难(不可能)得到任何有助于找出问题根源的信息 我有一个相当广泛的错误监控框架,它在所有常见的地方监视未处理的异常: 我控制的线程中的Backstop异常处理程序 WinForms异常的Application.ThreadException AppDomain.CurrentDomain.Unhand

我知道我甚至问这个问题都是在向一个皇家火焰敞开心扉,但我想我会看看StackOverflow是否有任何解决我所遇到问题的方法

我有一个C#应用程序在客户端站点出现故障,无法在本地复制。不幸的是,我很难(不可能)得到任何有助于找出问题根源的信息

我有一个相当广泛的错误监控框架,它在所有常见的地方监视未处理的异常:

  • 我控制的线程中的Backstop异常处理程序
  • WinForms异常的Application.ThreadException
  • AppDomain.CurrentDomain.UnhandledException
在我可以访问的地方记录详细信息

在过去,这对于识别生产代码中的问题非常有用,但目前还没有为我提供关于当前一系列问题的任何信息

我最好的猜测是,核心问题是一种“粗鲁”的异常类型(线程中止、内存不足、堆栈溢出、访问冲突等),它升级为粗鲁的关闭,在我有机会看到发生了什么之前就破坏了进程

当我的进程崩溃时,我是否可以对快照信息做一些有用的事情?理想情况下,我将能够写出我的自定义日志格式,但如果我能有一个可靠的方法来确保崩溃转储被写入某个地方,我将非常高兴

我希望我可以实现从CriticalFinalizerObject派生的类,并让它在处理时抛出最后一次错误注销,但在我测试的StackOverflow场景中似乎没有触发

由于缺少代码签名证书,我无法使用Windows错误报告和好友

我并不是试图从任意异常中“恢复”,我只是试图记录下在下降过程中出现的错误


有什么想法吗?

您可以尝试创建一个文件。这是一个C++ API,但是应该编写一个启动程序的小C++程序,它保持进程的句柄,等待进程句柄,然后在应用程序死亡时使用进程句柄创建一个MIIDUMP。
  • 在应用程序上尝试捕获。运行
  • 未处理的域异常
  • 未处理的线程异常
  • 在所有线程中尝试捕获处理程序
那么您可能已经捕获到异常,除非它是由第三方或COM组件抛出的

你肯定没有提供足够的信息

  • 客户说哪些事件导致异常
  • 您使用什么COM或第三方组件?(您是否正确地实例化和引用了这些组件?是否向COM函数调用传递了有效的参数?)
  • 您是否使用任何非托管-非安全代码
  • 您是否确定您的所有投球能力呼叫都覆盖了try-catch
我只是说,除非你发布更多的信息,否则没有人能给你提供任何有用的建议,即使这样,我们也可能只能猜测你问题的根源

用一双崭新的眼睛审视你的代码

某些错误无法通过日志记录捕获

有关更多详细信息,请参见此类似问题:

这里有一个链接解释异步异常(以及无法从中恢复的原因):


这是个好问题。火焰主要指向通用的
try-catch-simoke-OK
code。优雅的关闭和错误报告是注册全局异常处理程序的完全可以接受的理由。有一组神奇的异常无法被托管代码捕获。(如StackOverflowException)。本代码:使用系统;类c{static void Main(){try{f();}catch(Exception ex){Console.WriteLine(ex);}}}static void f(){f();}}不会捕获堆栈溢出,但应用程序将终止。@StarBright-是的,这就是为什么您需要检查代码,或者最好让其他人检查代码的原因。