如何在GC结束列表中列出所有对象



我的程序崩溃了,它是VS的可视化工具,所以,调试它非常困难,我尝试过dump并使用WinDbg来研究它,但它不成功。

所以,现在我试着把我的手放在列表编程,但我不知道怎么做。谢谢。

如果您想要查看对象是否在终结队列或f-可达队列中,当您启动WinDBG时,首先使用dumpheap -stat或任何其他命令定位您的对象。找到对象地址后,可以使用!FinalizeQueue,它将输出每代可结束的对象数量,以及准备结束的对象数量。前者为终结队列,后者为不可达队列。

例如:

0:003>! FinalizeQueue

待清理的SyncBlocks: 0个MTA接口待释放:0 STA待释放接口数:0

第0代有370个可终结对象
(0000000000 d29030→0000000000 d29bc0)

第一代有4个可终结对象
(0000000000 d29010→0000000000 d29030)

第2代有8个可终结对象
(0000000000 d28fd0→0000000000 d29010)

准备好完成571个对象
(0000000000 d29bc0→0000000000 d2ad98)

现在,你可以看到你的对象地址空间在哪里。

这里有一个很好的教程

我不认为有一种方法可以通过。net的托管框架类库(FCL)获得最终队列。我怀疑,如果你想以编程方式而不是使用WinDbg进行调试,你(就像WinDbg和类似的工具一样)需要使用CLR的非托管调试&对api进行分析。

ICORDebugGCReferenceEnum COM接口。您可以通过ICorDebugProcess5::EnumerateGCReferences检索该类型的对象:

"提供将被垃圾收集的对象的枚举数。"

"集合中由 [ICorDebugGCReferenceEnum::Next方法]填充的COR_GC_REFERENCE对象表示三种对象:

  • 所有托管堆栈中的对象。这包括托管代码中的实时引用以及公共语言运行库创建的对象。

  • 句柄表中的对象。这包括强引用(HNDTYPE_STRONGHNDTYPE_REFCOUNT)和模块中的静态变量。

  • 终结器队列中的对象。结束器队列在结束器运行之前根对象。"

(超链接和强调由我添加)

枚举器返回的每个对象都有一个字段type。您可能希望筛选字段与值CorGCReferenceType.CorReferenceFinalizer匹配的对象。

最新更新