我有一个问题(崩溃转储),我的关键部分被销毁,但在检查 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