2012-08-17 52 views
0

我有一個問題(崩潰轉儲),其中我的關鍵部分正在銷燬,但在檢查LockCount後,我注意到有一個線程在等待它(似乎線程已被喚醒,但尚未輸入,因爲鎖定狀態爲未鎖定)。轉儲關鍵部分隊列(線程等待)

我想看看什麼線程已被喚醒。我知道關鍵部分有一個等待線程的隊列,如果我可以轉儲這個隊列/列表結構,我應該能夠回答我的問題,關於我能做什麼的任何想法?

+0

你應該嘗試的堆棧跟蹤的所有線程。也許這個網頁會有幫助? http://msdn.microsoft.com/en-us/library/dd554943.aspx – jxh 2012-08-17 08:57:23

+0

不知道我明白 - 什麼是摧毀CS? – 2012-08-17 08:57:35

+0

@MartinJames對不起,不清楚。我的一個對象的析構函數正在刪除關鍵部分(這沒關係)。但是有一個線索已經被喚醒在其他地方獲得CS。由於線程剛剛被喚醒,所以沒有進入CS!cs -s地址顯示沒有線程擁有CS。 – 2012-08-17 09:00:19

回答

0

的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字段可能會給出這裏問題的答案。

+0

這是我通常做的。然而,我爲OwningThread得到了null,但是我的LockCount表明一個線程正在等待並且已經被喚醒。我想也許它還沒有進入CS。 – 2012-08-17 09:09:42

+0

我想知道LockCount是否存在誤解。請參閱MSDN上的[this](http://msdn.microsoft.com/zh-cn/magazine/cc164040.aspx)。 – Arno 2012-08-17 09:16:44

+0

LockCount的含義從Sever 2003起略有變化。我很確定我已經正確解釋了它,我只是做了一些簡單的操作來計算出各個部分(即線程狀態,線程喚醒和等待鎖定的線程)。 – 2012-08-17 09:33:39