我正在debugging一个GC堆腐败,并来到了我想尝试在WinDbg + PageHeap + AppVerifier + GCStress下运行该程序的步骤。
我发现在文章软件崩溃:错误模块mscorwks.dll,版本1.1.4322.2379 ,我可以启用GCStress像这样:
reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v HeapVerify /t REG_DWORD /d 1 reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v StressLog /t REG_DWORD /d 1 reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v GCStress /t REG_DWORD /d 3 reg.exe add "HKLM\SOFTWARE\Microsoft\.NETFramework" /f /v FastGcStress /t REG_DWORD /d 2
(我正在尝试这种方法,它需要程序永远启动,我删除了registry中的最后两个条目,使其工作,可能是方法本身有问题。
或者在没有非托pipe模块的gc_heap :: garbage_collect中的.NET 4 Runtime中的Access Violation文章介绍了另一种方法:
(DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536
哪种方法是正确的,还是有另一种正确的方法?
我在Koders上搜索了GCStress 。 原来,了解它的最好方法是查看.NET的源代码 :
enum GCStressFlags { GCSTRESS_NONE = 0, GCSTRESS_ALLOC = 1, // GC on all allocations and 'easy' places GCSTRESS_TRANSITION = 2, // GC on transitions to preemtive GC GCSTRESS_INSTR_JIT = 4, // GC on every allowable JITed instruction GCSTRESS_INSTR_NGEN = 8, // GC on every allowable NGEN instruction GCSTRESS_UNIQUE = 16, // GC only on a unique stack trace };