我有一個問題(崩潰轉儲),其中我的關鍵部分正在銷燬,但在檢查LockCount後,我注意到有一個線程在等待它(似乎線程已被喚醒,但尚未輸入,因爲鎖定狀態爲未鎖定)。轉儲關鍵部分隊列(線程等待)
我想看看什麼線程已被喚醒。我知道關鍵部分有一個等待線程的隊列,如果我可以轉儲這個隊列/列表結構,我應該能夠回答我的問題,關於我能做什麼的任何想法?
我有一個問題(崩潰轉儲),其中我的關鍵部分正在銷燬,但在檢查LockCount後,我注意到有一個線程在等待它(似乎線程已被喚醒,但尚未輸入,因爲鎖定狀態爲未鎖定)。轉儲關鍵部分隊列(線程等待)
我想看看什麼線程已被喚醒。我知道關鍵部分有一個等待線程的隊列,如果我可以轉儲這個隊列/列表結構,我應該能夠回答我的問題,關於我能做什麼的任何想法?
的CriticalSection的對象被定義爲
typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;
與RTL_CRITICAL_SECTION
定義爲
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
ULONG_PTR SpinCount; // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
OwningThread將包含的句柄擁有線程。 所以你可能只是閱讀CriticalSection
數據結構來獲取擁有線程的句柄。
DWORD WINAPI GetThreadId(_In_ HANDLE OwningThread);
將返回擁有線程的ID。
但是,OwningThread的定義存在一個小小的錯誤。 MSDN報告該字段實際上包含線程標識本身。
您可以使用
GetThreadInformation(OwningThread,....);
獲得更多線程的詳細信息。
Break Free of Code Deadlocks in Critical Sections Under Windows MSDN上是必須在這種情況下閱讀。特別是RTL_CRITICAL_SECTION_DEBUG
結構中的EntryCount/ContentionCount
字段可能會給出這裏問題的答案。
這是我通常做的。然而,我爲OwningThread得到了null,但是我的LockCount表明一個線程正在等待並且已經被喚醒。我想也許它還沒有進入CS。 – 2012-08-17 09:09:42
我想知道LockCount是否存在誤解。請參閱MSDN上的[this](http://msdn.microsoft.com/zh-cn/magazine/cc164040.aspx)。 – Arno 2012-08-17 09:16:44
LockCount的含義從Sever 2003起略有變化。我很確定我已經正確解釋了它,我只是做了一些簡單的操作來計算出各個部分(即線程狀態,線程喚醒和等待鎖定的線程)。 – 2012-08-17 09:33:39
你試過了嗎?有一個關於在這裏WinDbg的文檔的過程中觀察的關鍵部分信息:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff541979(v=vs.85).aspx
是的,我有。問題是我知道CS的地址,我知道它還沒有擁有線程。我在想這個線程已經被喚醒,但還沒有進入CS。我希望找出被喚醒的線程。 – 2012-08-17 15:33:46
你應該嘗試的堆棧跟蹤的所有線程。也許這個網頁會有幫助? http://msdn.microsoft.com/en-us/library/dd554943.aspx – jxh 2012-08-17 08:57:23
不知道我明白 - 什麼是摧毀CS? – 2012-08-17 08:57:35
@MartinJames對不起,不清楚。我的一個對象的析構函數正在刪除關鍵部分(這沒關係)。但是有一個線索已經被喚醒在其他地方獲得CS。由於線程剛剛被喚醒,所以沒有進入CS!cs -s地址顯示沒有線程擁有CS。 – 2012-08-17 09:00:19