确定待定的终结器源

时间:2011-09-30 17:09:30

标签: c# .net compact-framework

我正在进入一个已知问题的项目。该应用程序会在调用GC.WaitForPendingFinalizers时挂起。显而易见的解决方案解决方法是删除WaitForPendingFinalizers调用,但不幸的是,这是在第三方程序集中为我们完成的,因此删除不是一种选择。

相反,我想找到问题的根源,并找出谁的终结器正在阻止。然而,代码库很大,因为我只是进入它,它也是陌生的,所以我甚至没有任何直觉或直觉的可能性。这意味着我将需要使用intrumentation和工具来帮助找到它。

所以我的问题是:

  1. 迭代Finalizer Queue的框架/ ee线程是否会出现在Studio的Threads视图中?对此进行堆栈跟踪将有助于找到我们挂起的位置。
  2. 是否有一个工具可以向我显示待定的终结器及其根(这是一个CF项目,但我愿意采取广泛的途径来尝试找到它)?
  3. 任何人都有任何想要分享的想法或经验,可能有助于找到这个?

2 个答案:

答案 0 :(得分:1)

这可能是Windbg是你的朋友的案例之一。看看苔丝的博客。这是一篇关于使用!finalizequeue debugger命令调试终结器问题的文章。 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的博客上做更多的阅读。她有一些文章让它非常平易近人。)

答案 1 :(得分:1)

我快速浏览了VS(VS 11),当我休息时,我可以看到一个名为“GC Finalizer Thread”的线程,它在我的析构函数中被捕获了一个Sleep()。

但是你提到的CF可能会让它成为一个完全不同的球赛。