【问题标题】:Get ThreadState of suspended thread获取挂起线程的ThreadState
【发布时间】:2018-09-09 02:09:30
【问题描述】:

对于一个简单的采样分析器,我正在暂停一个目标线程,获取其当前堆栈跟踪,然后继续它。 现在,如果线程处于等待状态,我想以不同的方式突出显示一个示例。

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

我可以通过NtQuerySystemInformation(SystemProcessInformation) 获得这些信息,但获得的信息远远超出需要,每个进程的每个线程的信息。

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

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

【问题讨论】:

标签: c winapi


【解决方案1】:

虽然不是我想要的,QueryThreadCycleTime 已经足够接近了。

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

这并不完美,线程进入等待状态时采集的第一个样本未被检测为等待,并且限制可能不适用于所有 CPU。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多