【发布时间】:2018-09-09 02:09:30
【问题描述】:
对于一个简单的采样分析器,我正在暂停一个目标线程,获取其当前堆栈跟踪,然后继续它。 现在,如果线程处于等待状态,我想以不同的方式突出显示一个示例。
所以我想知道线程在挂起时是否阻塞(通过 WaitForSingleObject 等待,通过 Sleep 暂停,...)。
我可以通过NtQuerySystemInformation(SystemProcessInformation) 获得这些信息,但获得的信息远远超出需要,每个进程的每个线程的信息。
我也看到了Performance Counters,但如果我只有线程 ID/句柄,我不确定这个 API 是否可行。
更新:
IInspectable 用Wait Chain Traversal 给了我一个提示,虽然它看起来很合适,但它为所有挂起的线程返回状态ObjectStatus==WctStatusBlocked,这不是不合理的,但对我的问题不起作用。我认为它也很慢,因为它收集了整个链的数据,而我只关心第一个元素。
【问题讨论】:
-
“但这比需要的要多得多” - 这是个问题吗?
-
您的意思是暂停还是仅仅被阻止?哦,你想知道它在你暂停之前是否被阻止......
-
@mnistic:绝对不是重复的。 OP 知道线程被挂起,因为他挂起它。
-
Wait Chain Traversal 可能会为您提供该信息。