5

我知道我什至问这个问题就是在向皇室燃烧自己敞开心扉,但我想我会看看 StackOverflow 是否有任何解决方案来解决我遇到的问题......

我有一个 C# 应用程序在客户端站点以我无法在本地重现的方式失败。不幸的是,我很难(不可能)获得任何有助于隔离问题根源的信息。

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

  • 我控制的线程中的支持异常处理程序
  • 用于 WinForms 异常的 Application.ThreadException
  • AppDomain.CurrentDomain.UnhandledException

在我可以访问它们的地方记录详细信息。

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

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

当我的进程崩溃时,我可以做些什么来快照信息,这将是有用的吗?理想情况下,我将能够写出我的自定义日志格式,但如果我能有一种可靠的方法来确保在某处写入故障转储,我会很高兴。

我希望我可以实现派生自 CriticalFinalizerObject 的类,并让它在处理时吐出最后机会错误日志,但这似乎在我测试的 StackOverflow 场景中没有被触发。

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

我不是想从任意异常中“恢复”,我只是想记下在下降过程中出了什么问题。

有任何想法吗?

4

2 回答 2

1

您可以尝试创建一个小型转储文件。这是一个 C++ API,但应该可以编写一个小的 C++ 程序来启动您的应用程序,保留进程的句柄,等待进程句柄,然后在应用程序终止时使用进程句柄创建一个小型转储。

于 2010-02-04T02:25:49.583 回答
1

如果你做了你声称的事情:

  • 在 Application.Run 上尝试捕获
  • 未处理的域异常
  • 未处理的线程异常
  • 在所有线程中尝试 Catch 处理程序

那么你就会发现异常,除非它是由第三方或 COM 组件抛出的。

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

  • 客户说哪些事件会导致异常?
  • 您使用什么 COM 或第三方组件?(您是否正确地实例化和引用这些组件?您是否将有效参数传递给 COM 函数调用?)
  • 您是否使用任何非托管 - 不安全的代码?
  • 确定你有 try-catch 覆盖的所有可以抛出的调用吗?

我只是说,除非您发布更多信息,否则没有人可以为您提供任何有用的建议,即使如此,我们也可能只能推测您问题的根源。

用全新的眼光审视您的代码。

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

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

.NET 中的 StackOverflowException

这是一个解释异步异常的链接(以及为什么您无法从它们中恢复):

http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=c1898a31-a0aa-40af-871c-7847d98f1641

于 2010-02-04T02:52:38.467 回答