У меня проблема с критическим разделом в C ++. У меня зависшее окно, и когда я сбрасываю процесс, я вижу, что поток ожидает в критическом разделе:
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
Строковые данные и т. Д. Все указывают на вход в конкретный критический раздел. Единственная проблема заключается в том, что, похоже, никакие другие потоки не удерживают этот критический раздел открытым. Команда Windbg! Locks ничего не указывает, а выгрузка критического раздела указывает на то, что он не заблокирован, что видно по нулевому владельцу и -1 LockCount в структуре ниже.
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
Как это возможно? Даже в тупике, когда другой поток не вызвал LeaveCriticalSection, я ожидал увидеть сам критический раздел, помеченный как заблокированный. Есть ли у кого-нибудь предложения по отладке или возможные исправления?