当抛出异常时,捕获所有线程的堆栈跟踪

4
我正在使用由WCF服务支持的ASP.NET网站,其中服务会随机抛出异常,最终在网站上被捕获,并在那里创建YSOD。我怀疑这是由于后端线程问题引起的,并希望跟踪该问题。
有没有一种简单的方法在WCF端捕获未捕获的异常,并捕获所有正在运行的线程的堆栈跟踪,并重新抛出初始异常和附加信息?
这个多线程跟踪似乎是框架自带的,或者其他人可能已经考虑过,但我找不到任何信息。

“eventually”听起来很像在finalizer中有一个异常...那么这个异常是什么?“eventually”也让我想到其他线程的堆栈跟踪将不再有帮助,因为它们不再代表导致异常的系统状态。你是否碰巧使用了Task API? - Marc Gravell
@Marc最终是因为WCF通道有时会超时。此时,所有的希望都破灭了,但其他时候,我们会得到一个真正的异常,但无法重现它。我希望通过快照,它可以提供一些方向。 - jasper
我认为其他线程的堆栈跟踪对你没有关系。如果其他线程行为正常,那么它们所做的事情与你的请求线程无关。如果它们破坏了共享数据,则它们可能已经离开了当时执行该操作的位置。 - John Saunders
@JohnSaunders 我们的系统有一个问题(设计不当),我们已经采用一种解决方法(魔改/更差的设计)来防止错误发生,只允许在某个特定时间内一个线程进入后端。其他请求将被阻塞,直到初始请求完成。我想确认它们是否被阻塞。通过肉眼观察堆栈跟踪日志可以看到这一点(在间歇性情况下)。 - jasper
我建议您查看VS 2010(及更高版本)调试器中的线程可视化工具。 - John Saunders
显示剩余2条评论
1个回答

2
为了捕捉其他线程的堆栈跟踪,您需要在调试器中,并在异常被抛出时查看它们的堆栈(例如使用Parallel Stack Window),但这并不能让您发送它们的跟踪信息。
您可以在代码中插入工具(即在战略位置上添加它)以记录其他线程可以获取到的堆栈跟踪,但这会带来糟糕的性能、维护和优雅问题。更不用提自异常抛出后,它们可能已经独立地前进了。
我目前唯一想到的其它方式是(这只是推测)某种方式中止其他线程,捕捉中止,保存堆栈跟踪,然后重置中止。但这可能会变成一个非确定性的混乱。终止线程不是建议的做法。
您最好使用调用分析器、大量日志记录,并尽可能将范围缩小以找到根本原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接