c - 获取挂起线程的ThreadState

标签 c winapi

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

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

我可以通过 NtQuerySystemInformation(SystemProcessInformation) 获取此信息,但这比需要的要多得多,每个进程的每个线程的信息。

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

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

最佳答案

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

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

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

关于c - 获取挂起线程的ThreadState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52240779/

相关文章:

c - 接收 AT 命令

c - MPI_Isend请求参数

c - 根CA的SSL_CTX_set_verify()回调和深度

c - 逻辑算术移位

c# - 记录和恢复应用程序状态以快速启动 .NET 应用程序

通过家庭网络上两台机器之间的套接字连接?

c - 在 MVS 2010 Professional v/s Express for C 中发布版本

winforms - C# WM_VScroll 和 VScroll 控件

c++ - Thread Local Storage 可以伪造/破解吗?

c++ - DirectX pEnum->Next(1,&pPin,NULL) 返回 S_FALSE