C# 确定挂起的终结器源

C# 确定挂起的终结器源,c#,.net,compact-framework,C#,.net,Compact Framework,我进入一个有已知问题的项目。应用程序挂起对GC.WaitForPendingFinalizers的调用。显而易见的解决办法是删除WaitForPendingFinalizers调用,但不幸的是,这是在第三方程序集中为我们完成的,因此不能选择删除 相反,我想找到问题的根源,并找出谁的终结器被阻止了。然而,代码库很大,而且由于我刚刚进入,它也不熟悉,所以我甚至没有任何直觉或直觉知道它可能在哪里。这意味着我需要使用仪器和工具来帮助找到它 因此,我的问题是: 正在迭代终结器队列的framework/ee

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

相反,我想找到问题的根源,并找出谁的终结器被阻止了。然而,代码库很大,而且由于我刚刚进入,它也不熟悉,所以我甚至没有任何直觉或直觉知道它可能在哪里。这意味着我需要使用仪器和工具来帮助找到它

因此,我的问题是:

  • 正在迭代终结器队列的framework/ee线程会出现在Studio的Threads视图中吗?这方面的堆栈跟踪将大大有助于找到我们悬挂的位置
  • 是否有一个工具可以向我展示待定的终结器及其根(这是一个CF项目,但我愿意走更广的路来尝试并找到它)
  • 有人有任何想法或经验想分享,可能有助于找到这一点

  • 这可能是Windbg是您的朋友的情况之一。看看苔丝的博客。下面是一篇关于调试终结器问题的文章!finalizeequeue调试器命令

    (如果您以前从未使用windbg和sos.dll做过任何事情,请在Tess的博客上多读一些文章。她有一些文章使其非常容易理解)。

    我快速查看了VS(VS 11),当我中断时,可以看到一个名为“GC Finalizer Thread”的线程,它被发现在我的析构函数中执行Sleep()


    但是你提到CF可能会使它成为一个完全不同的游戏

    是的,对我来说没有“GC终结器Thrad”,尽管在完整框架下的存在至少会让我看到代码库的CF->桌面端口的挑战(让我们希望它接口良好)。这只是一个想法,但如果你在某个地方插入dtor并在其中放置断点会怎么样?那根线应该断了。