确定挂起的终结器源

本文关键字:挂起 | 更新日期: 2023-09-27 18:10:21

我即将进入一个有已知问题的项目。应用程序挂起对GC.WaitForPendingFinalizers的调用。明显的解决方案解决方案是删除WaitForPendingFinalizers调用,但不幸的是,这是在第三方程序集中为我们完成的,因此删除不是一个选项。

相反,我想找到问题的根源,并找出谁的终结器阻塞了。然而,代码库很大,因为我刚刚接触它,所以它也很陌生,所以我甚至没有任何直觉或直觉。这意味着我将需要使用仪器和工具来帮助找到它。

我的问题是:

  1. 将框架/ee线程迭代的终结队列显示在线程视图在工作室?堆栈跟踪对于找到我们挂起的地方有很长的路要走。
  2. 是否有一个工具,将显示我悬而未决的定稿和他们的根(这是一个CF项目,但我愿意采取广泛的路径来尝试找到这个)?
  3. 有人有任何想法或经验,他们想分享,可能有助于找到这个?

确定挂起的终结器源

我在VS (VS 11)中快速查看,当我打破时,我可以看到一个名为"GC终结线程"的线程,它被捕获在我的析构函数中执行Sleep()。

但是你提到CF可能会使事情完全不同。

在这种情况下,Windbg可能是您的朋友。看看苔丝的博客。这是一篇关于使用finalizequeue调试器命令调试终结器问题的文章。http://blogs.msdn.com/b/tess/archive/2007/10/19/net-finalizer-memory-leak-debugging-with-sos-dll-in-visual-studio.aspx

(如果您以前从未使用过windbg和sos.dll,请在Tess的博客上阅读更多内容。她有一些文章使它非常平易近人。