Tengo un problema con una sección crítica en C++. Estoy recibiendo una ventana de guillotina y cuando yo tiro el proceso puedo ver el hilo que espera en una sección crítica:¿Por qué mi hilo está bloqueado por una sección crítica que no retiene?
16 Id: b10.b88 Suspend: 1 Teb: 7ffae000 Unfrozen
ChildEBP RetAddr
0470f158 7c90df3c ntdll!KiFastSystemCallRet
0470f15c 7c91b22b ntdll!NtWaitForSingleObject+0xc
0470f1e4 7c901046 ntdll!RtlpWaitForCriticalSection+0x132
0470f1ec 0415647e ntdll!RtlEnterCriticalSection+0x46
Los datos de la línea, etc, todo indica que la entrada en una sección crítica específica. El único problema es que no hay otros subprocesos que mantengan abierta esta sección crítica. El comando de bloqueos de Windbg no indica nada y la sección crítica indica que no está bloqueado, como puede ver el propietario nulo y -1 LockCount en la estructura siguiente.
0:016> dt _RTL_CRITICAL_SECTION 42c2318
_RTL_CRITICAL_SECTION
+0x000 DebugInfo : 0x02c8b318 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : -1
+0x008 RecursionCount : -1
+0x00c OwningThread : (null)
+0x010 LockSemaphore : 0x00000340
+0x014 SpinCount : 0
0:016> dt _RTL_CRITICAL_SECTION_DEBUG 2c8b318
_RTL_CRITICAL_SECTION_DEBUG
+0x000 Type : 0
+0x002 CreatorBackTraceIndex : 0x2911
+0x004 CriticalSection : 0x042c2318 _RTL_CRITICAL_SECTION
+0x008 ProcessLocksList : _LIST_ENTRY [ 0x2c8b358 - 0x2c8b2e8 ]
+0x010 EntryCount : 1
+0x014 ContentionCount : 1
+0x018 Flags : 0xbaadf00d
+0x01c CreatorBackTraceIndexHigh : 0xf00d
+0x01e SpareWORD : 0xbaad
¿Cómo es esto posible? Incluso en un punto muerto donde otro hilo no ha llamado a LeaveCriticalSection esperaría ver la sección crítica marcada como bloqueada. ¿Alguien tiene alguna sugerencia de depuración o posibles soluciones?
Una cosa que verificaría es si he hecho una sola EnterCriticalSection seguida de 2 LeaveCriticalSections. – Naveen
Compruebe que la sección crítica no se haya eliminado. De [DeleteCriticalSection] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682552%28v=vs.85%29.aspx): si se elimina una sección crítica mientras todavía es propiedad, el estado de los hilos que esperan la propiedad de la sección crítica eliminada no está definido. – hmjd
@hmjd probablemente es correcto mead 0xbaadf00d que se realizó la desasignación. – Zuljin