转储关键节队列(线程正在等待)



我有一个问题(崩溃转储),我的关键部分被销毁,但在检查 LockCount 后,我注意到有 1 个线程在等待它(似乎线程已被唤醒,但尚未进入,因为锁定状态为未锁定)。

我想看看唤醒了什么线程。我知道关键部分有一个等待线程的队列,如果我能转储这个队列/列表结构,我应该能够回答我的问题,有什么想法吗?

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,....);

以获取更多线程详细信息。

MSDN 上的 Windows 下的关键部分中摆脱代码死锁是在此上下文中必读的。特别是RTL_CRITICAL_SECTION_DEBUG结构中的EntryCount/ContentionCount字段可能会在这里给出问题的答案。

你试过锁吗?有关在 WinDBG 文档中查看流程中的关键部分的信息,请参阅此处:

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

最新更新