我的程序崩溃了,它是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_STRONG
和HNDTYPE_REFCOUNT
)和模块中的静态变量。终结器队列中的对象。结束器队列在结束器运行之前根对象。"
(超链接和强调由我添加)
枚举器返回的每个对象都有一个字段type
。您可能希望筛选字段与值CorGCReferenceType.CorReferenceFinalizer
匹配的对象。