我的程序出现了崩溃,它是一个用于VS的可视化工具,因此很难调试。我已经尝试过生成转储文件并使用WinDbg进行分析,但都没有成功。
所以现在我想通过编程方式来处理这个列表,但我不知道该怎么做。谢谢。
我的程序出现了崩溃,它是一个用于VS的可视化工具,因此很难调试。我已经尝试过生成转储文件并使用WinDbg进行分析,但都没有成功。
所以现在我想通过编程方式来处理这个列表,但我不知道该怎么做。谢谢。
dumpheap -stat
或任何其他命令找到您的对象。找到对象的地址后,您可以使用!FinalizeQueue
,它将输出每个代中有多少个可终结对象以及有多少个准备终结的对象。前者是终结队列,后者是f-reachable队列。0:003> !FinalizeQueue
需要清理的同步块: 0,需要释放的MTA接口: 0,需要释放的STA接口: 0
第0代有370个可终结对象
(0000000000d29030->0000000000d29bc0)第1代有4个可终结对象
(0000000000d29010->0000000000d29030)第2代有8个可终结对象
(0000000000d28fd0->0000000000d29010)准备终结571个对象
(0000000000d29bc0->0000000000d2ad98)
现在,您可以看到对象地址空间在哪里。
这里提供了一个很好的教程。
devenv
进程进行转储。但我无法捕捉到制作转储的精确时刻。 - YolaCOR_GC_REFERENCE
集合中的对象(通过 ICorDebugGCReferenceEnum::Next
方法 填充)代表三种类型的对象:
来自所有托管堆栈的对象。这包括托管代码中的活动引用以及由公共语言运行时创建的对象。
来自句柄表的对象。这包括模块中的强引用 (HNDTYPE_STRONG
和 HNDTYPE_REFCOUNT
) 以及静态变量。
来自终结器队列的对象。终结器队列会在终结器运行之前保留对象的根引用。
type
。您可能想要过滤出该字段值匹配CorGCReferenceType.CorReferenceFinalizer
的对象。tlbimp
工具从.tlb
生成一个带有COM互操作类型的.NET“主要互操作程序集”。 - stakx - no longer contributing