【发布时间】:2015-12-17 10:25:16
【问题描述】:
我有一个庞大而复杂的进程,它在生产环境中运行,基本上是用 C# 开发的 WPF 用户界面。它还托管用 C++ 非托管和托管代码编写的线程和 DLL。
通常,如果引发异常,则会将其捕获并将相关的堆栈转储写入日志文件以进行事后调试。不幸的是,有时应用程序在没有在日志中写入任何信息的情况下崩溃,因此我们不知道是谁导致了崩溃。
是否有人知道如何检测并最终追踪导致应用程序崩溃的所有原因,并且使用简单的 try-catch 块无法检测到?
举个例子,我看到 StackOverflow 异常没有被捕获,也没有检测到来自非托管代码的 0xc0000374 之类的错误。这不是调试它的问题。我知道我可以将调试器附加到系统并尝试重现问题。但正如我所说,这是一个生产系统,我必须在问题发生后分析来自现场的问题。
【问题讨论】:
-
某些程序错误太严重,无法让程序继续运行。 CLR 或操作系统都会拔掉插头,没有堆栈跟踪。如果您有一个在生产环境中运行的程序经常因 SOE 和堆损坏而失败,那么您将遇到一个非常棘手的大问题,您只能从小型转储中诊断出这种问题。需要黑带调试技能。说真的,快跑,快跑!
-
不幸的是,安装此软件的现场报告了一些(不多但不可忽略的)崩溃。问题不是系统的,没有人知道重现它的顺序。但在我看来,这是一个普遍的话题。我希望系统能够为所有故障生成转储或堆栈跟踪,以帮助对验证阶段未检测到的问题进行事后调试。它实际上不仅与当前问题有关。我知道如何在嵌入式系统上的 Linux/RTOS 中做到这一点,我有超过 15 年的经验,但我是微软的新手