我遇到了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's!locks命令沒有顯示任何內容,並且轉儲臨界區域表明它沒有鎖定,如下面結構中的null owner和-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的死鎖中,我也希望看到關鍵部分本身被標記爲鎖定。有沒有人有任何調試建議或可能的修復?
有一件事我會檢查是我是否做了一個EnterCriticalSection的後跟2個LeaveCriticalSections。 – Naveen 2012-01-12 04:23:43
檢查關鍵部分是否未被刪除。從[DeleteCriticalSection](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682552%28v=vs.85%29.aspx):如果臨時部分仍然擁有時被刪除,等待已刪除關鍵部分的所有權的線程的狀態是未定義的。 – hmjd 2012-01-12 08:49:12
@hmjd可能是正確的0xbaadf00d mead,執行釋放。 – Zuljin 2012-01-12 18:19:51