Определить время ожидания потока в WinDbg с дампом пользовательского режима

существует ли какой-либо способ в WinDbg определить, с какой даты/времени поток Windows блокируется функциями типа WaitForSingleObjects или WaitForMultipleObjects?

Я знаю, как это сделать при отладке ядра (используя !thread), но я понятия не имею, как это сделать в режиме отладки пользовательского режима.

Ответ 1

В WinDbg вы можете использовать !runaway для получения таймингов потока:

!runaway
!runaway 1

(время пользователя)

!runaway 2

(время ядра)

!runaway 4

(прошедшее время)

(Вы обнаружите, что эти документы указаны как 0, 1 и 2 в некоторых местах, но по моему опыту они не работают. Возможно, это зависит от версии WinDbg или чего-то еще...)

Вы можете вычислить время, потраченное на приостановку, вычитая время пользователя и время ядра из него по истечении времени, но, к сожалению, я ничего не знаю (не написав плагин WinDbg), чтобы заставить WinDbg сделать это за вас.

Если вы не настроены на WinDbg, вы можете использовать Process Explorer для получения той же информации. Когда вы щелкните правой кнопкой мыши процесс и выберите вкладку потоков в диалоговом окне свойств, вы получите список всех потоков в этом процессе. Выбор конкретного потока покажет одну и ту же информацию о времени.