我有一个庞大而复杂的流程,它运行在一个基本上是用C#开发的WPF用户界面的生产环境中。它还托管用C ++非托管和托管代码编写的线程和DLL。
通常情况下,如果异常引发,则会将其捕获并将相关的堆栈转储写入日志文件中以进行事后调试。不幸的是,应用程序不时会在日志中写入任何信息而崩溃,因此我们不知道是谁造成了崩溃。
是否有人知道如何检测并最终跟踪导致应用程序崩溃的所有原因并且未通过简单的try-catch块检测到?
举一个例子,我看到没有捕获到StackOverflow Exception,也没有检测到来自非托管代码的 0xc0000374 等错误。这不是调试它的问题。我知道我可以将调试器附加到系统并尝试重现问题。但正如我所说,这是一个生产系统,我必须分析问题发生后来自现场的问题。
答案 0 :(得分:0)
与C#异常不同,C ++异常不会捕获硬件异常,例如访问冲突或堆栈溢出,因为C ++应用程序不受管理且直接在cpu上运行。
对于崩溃后分析,我建议使用类似breakpad的内容。 breakpad将创建一个转储文件,它将为您提供非常有用的信息,例如调用堆栈,运行线程和堆栈/堆内存,具体取决于您的配置。
这样你就不需要目睹崩溃发生,甚至尝试重现它,我从经验中知道可能非常困难。您只需要从用户设备中检索这些故障转储的方法。
答案 1 :(得分:0)
您可以通过订阅AppDomain.UnhandledException事件来记录异常。其args.ExceptionObject
参数的类型为object
,其设计不受C#异常限制,因此您可以调用ToString
方法将其记录到某处。
另请查看MSDN文档的限制。例如:
从.NET Framework 4开始,不会针对损坏进程状态的异常(例如堆栈溢出或访问冲突)引发此事件,除非事件处理程序是安全关键的并且具有HandleProcessCorruptedStateExceptionsAttribute属性。
答案 2 :(得分:0)
解决了!我遵循了Mohamad Elghawi建议,并整合了breakpad。在为了使它在Visual Studio 2008下进行编译,链接和工作而经历了很多努力之后,我能够捕获关键系统异常并生成崩溃转储。我也能够按需生成转储,当应用程序由于某种原因而卡住时,这很有用,并且我能够通过监视所有其他应用程序的外部线程来识别此问题。 请注意 !视觉工作室解决方案不包含在git repo和gyp工具中,与某些线程中错误提及的相反,它也不存在。你必须单独下载gyp工具并在breadpad 3中的.gyp文件上稍微工作一下,以便生成一个合适的解决方案。此外,如果要在Visual Studio 2008中编译它们,则会丢失一些包含文件和定义,因此您还必须对其进行管理。
谢谢你们!