繁体   English   中英

确定待定的终结器源

[英]Determining Pending Finalizer Sources

我正在参加一个存在已知问题的项目。 该应用程序挂在对GC.WaitForPendingFinalizers的调用上。 显而易见的 解决 方案是删除WaitForPendingFinalizers调用,但不幸的是,此操作已在第三方程序集中为我们完成,因此无法删除。

相反,我想找到问题的根源,并弄清楚谁的终结者正在阻止。 但是,代码库很大,而且由于我刚接触它,所以它也不熟悉,所以我什至对它可能在哪里都没有任何直觉或直觉。 这意味着我将需要使用仪器和工具来找到它。

所以我的问题是:

  1. 会在Studio的“线程”视图中显示正在迭代Finalizer队列的Framework / ee线程吗? 为此的堆栈跟踪将大大有助于找到我们挂在哪里。
  2. 有没有一种工具可以向我显示即将完成的终结器及其根源(这是一个CF项目,但我愿意走宽的道路来尝试找到它)?
  3. 是否有任何他们想分享的想法或经验可以帮助您找到答案?

这可能是Windbg是您的朋友的情况之一。 看看Tess的博客。 这是有关使用!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的博客上进行更多阅读。她提供了一些文章,使其很容易上手)。

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

但是您对CF的提及可能会使它完全不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM