0

クリティカル セクションが破棄されるという問題 (クラッシュ ダンプ) がありますが、LockCount を調べた後、1 つのスレッドが待機していることに気付きました (ロック ステータスが Not であるため、スレッドは起動されたが、まだ入力されていないようですロックされています)。

どのスレッドが起こされたかを確認したい。クリティカル セクションには待機中のスレッドのキューがあることはわかっています。このキュー/リスト構造をダンプできれば、質問に答えることができるはずです。何ができるかについてのアイデアはありますか?

4

2 に答える 2

0

!ロックを試しましたか? ここの WinDBG ドキュメントには、プロセス内のクリティカル セクションの表示に関する情報があります。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff541979(v=vs.85).aspx

于 2012-08-17T15:21:59.813 に答える
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は、フィールドに実際にスレッド ID 自体が含まれていると報告しています。

あなたは使用することができます

GetThreadInformation(OwningThread,....);

スレッドの詳細を取得します。

Break Free of Code Deadlocks in Critical Sections Under Windows on MSDN は、このコンテキストで読む必要があります。特に、構造EntryCount/ContentionCount内のフィールドは、RTL_CRITICAL_SECTION_DEBUGここでの質問に対する答えを与える可能性があります。

于 2012-08-17T09:05:36.010 に答える