net leaks dotnet .net windows debugging garbage-collection heap-corruption

.net - dotnet - memory leaks c#



¿Cómo activar GCStress en Windows 7? (1)

Estoy depurando una corrupción de montón de GC y llegué al paso en el que quiero intentar ejecutar el programa en WinDbg + PageHeap + AppVerifier + GCStress.

Encontré en el artículo Fallo de software: módulo de fallas mscorwks.dll, versión 1.1.4322.2379, que puedo habilitar GCStress de esta manera:

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

(Estoy probando este método. Se necesita ejecutar el programa para siempre. Eliminé las dos últimas entradas del registro para que funcione, probablemente algo esté mal con el enfoque en sí).

O el artículo Violación de acceso en .NET 4 Runtime en gc_heap :: garbage_collect sin módulos no administrados describió el otro método:

(DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536

¿Qué camino es correcto o hay otra forma correcta ?


Busqué GCStress en Koders . Resultó que la mejor manera de entenderlo es mirando el código fuente de .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 };