获取挂起线程的ThreadState

时间:2018-09-09 02:09:31

标签: c winapi

对于一个简单的采样探查器,我要挂起目标线程,获取其当前的堆栈跟踪,然后继续执行。 现在,如果线程处于等待状态,我想以不同的方式突出显示示例。

所以我想知道线程在挂起时是否正在阻塞(通过WaitForSingleObject等待,通过睡眠暂停,...)。

我可以通过NtQuerySystemInformation(SystemProcessInformation)获取此信息,但是所获得的信息远远超出了每个进程的每个线程的信息。

我还看到了Performance Counters,但是如果我只有线程ID /句柄,我不确定此API是否可行。

更新: IInspectable给了我Wait Chain Traversal的提示,虽然看起来很合适,但它会返回所有挂起线程的状态ObjectStatus==WctStatusBlocked,这不是不合理的,但对我的问题不起作用。我认为这也很慢,因为它收集了整个链的数据,而我只关心第一个元素。

1 个答案:

答案 0 :(得分:0)

虽然不是我想要的,QueryThreadCycleTime却足够亲密。

因此,每次线程被挂起时,都会调用QueryThreadCycleTime,该线程将返回该线程到目前为止所使用的CPU时钟周期数。 如果与上一次通话的差额低于某个限制,则当前样本被视为正在等待。

这并不完美,线程进入等待状态时获取的第一个样本未检测到等待,并且该限制可能不适用于所有相同的CPU。