【问题标题】:Capture stacktrace for all threads when an exception is thrown抛出异常时捕获所有线程的堆栈跟踪
【发布时间】:2012-08-24 00:27:01
【问题描述】:

我正在使用由 WCF 服务支持的 ASP.NET 站点,该服务随机抛出异常,最终在站点上捕获,并在那里创建 YSOD。我怀疑这是由于后端的线程问题造成的,并希望跟踪该问题。

是否有一种简单的方法可以在 WCF 端捕获未捕获的异常,同时捕获所有正在运行的线程的堆栈跟踪,并使用附加信息重新抛出初始异常?

这个多线程跟踪看起来像是框架附带的东西,或者其他人以前可能想过,但我似乎找不到任何东西。

【问题讨论】:

  • 您应该仍然能够挂接到 AppDomain.UncaughtException 事件。
  • “最终”听起来很像终结器中的异常......异常是什么? “最终”也让我认为其他线程的堆栈跟踪不会有帮助,因为它们不再代表导致异常的系统状态。您是否有机会使用Task API?
  • @Marc 最终是因为 WCF 通道有时会超时。在这一点上,所有的希望都失去了,但其他时候,我们得到了一个真正的例外,但不能回购它。我希望通过快照,它可以提供一些方向。
  • @MarcGravell 我们没有在中间层使用任务 API。如果是多线程问题,我认为这是由于并发 WCF 请求/线程,围绕一些共享的“资源”。
  • 我认为其他线程的堆栈跟踪对您来说并不重要。如果其他线程正在运行,那么他们正在做与您的请求线程无关的事情。如果他们正在丢弃共享数据,那么他们可能已经从他们这样做时的位置继续前进。

标签: c# .net multithreading wcf exception


【解决方案1】:

为了捕获其他线程的堆栈跟踪,您必须在调试器中并在抛出异常时查看它们的堆栈(例如,使用并行堆栈窗口),但这并不能让您发送它们的追溯。

您可以检测您的代码(即,将其放在战略位置)以记录其他线程可以访问的堆栈跟踪,但这会带来令人讨厌的性能、维护和优雅问题。更不用说它只会近似其他线程正在做的事情,因为它们可以在抛出异常后独立前进。

我能想到的唯一其他方法(这是推测)是以某种方式中止其他线程,捕获中止,保存堆栈跟踪,然后重置中止。但这很可能是一个不确定的混乱。不建议中止。

最好使用呼叫分析器、大量日志记录并尽可能缩小范围以找到根本原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多