Получить ThreadState приостановленной нити - PullRequest
0 голосов
/ 09 сентября 2018

Для простого профилировщика выборки я приостанавливаю целевой поток, получаю его текущую трассировку стека и продолжаю его. Теперь я хотел бы выделить образец по-другому, если поток находился в состоянии ожидания.

Итак, я хочу знать, блокировался ли поток (ожидание через WaitForSingleObject, пауза через Sleep, ...) во время приостановки.

Я могу получить эту информацию через NtQuerySystemInformation (SystemProcessInformation) , но она получает гораздо больше, чем необходимо, информации о каждом потоке каждого процесса.

Также я видел Счетчики производительности , но я не уверен, возможно ли с этим API, если у меня есть только идентификатор / дескриптор потока.

UPDATE: IInspectable дал мне подсказку с Wait Chain Traversal , хотя он казался подходящим, он возвращает статус ObjectStatus==WctStatusBlocked для всех приостановленных потоков, что не является необоснованным, но не работает для моей проблемы , Это также очень медленно, я полагаю, потому что он собирает данные для всей цепочки, в то время как я забочусь только о первом элементе.

1 Ответ

0 голосов
/ 17 января 2019

Хотя это не совсем то, что я хотел, QueryThreadCycleTime достаточно близко.

Таким образом, каждый раз, когда поток приостанавливается, вызывается QueryThreadCycleTime, который возвращает количество тактов ЦП, используемых этим потоком до этой точки. Если разница с предыдущим вызовом ниже определенного предела, текущая выборка считается ожидающей.

Это не идеально, первая выборка, взятая, когда поток перешел в состояние ожидания, не определяется как ожидающая, и ограничение может работать не для всех процессоров одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...