Многопоточное приложение показывает только один поток при запуске! Ntsdexts.locks в WinDbg.Как узнать другой поток, вызывающий тупик? - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь отладить тупик многопоточного приложения с помощью windbg.
Это просто показывает один поток как вывод, когда я запускаю команду !ntsdexts.locks в windbg.
Как я могу найти другую ветку, которая его блокирует?

Я не получаю подсказок о том, какой раздел отлаживать!

0:027> !ntsdexts.locks

CritSec +6ec98b00 at 000001cc6ec98b00
WaiterWoken        No
LockCount          2
RecursionCount     1
OwningThread       277c
EntryCount         0
ContentionCount    18
*** Locked

Scanned 13 critical sections

1 Ответ

1 голос
/ 02 мая 2019

Команда дает вам критический раздел и поток-владелец, который 277c.

Теперь вам нужно выяснить, что этот поток делает.Начните с ~~[277c]s и посмотрите на стек вызовов.Он может просто находиться в бесконечном цикле, но также может быть в вызове WaitForSingleObject() или WaitForMultipleObjects().

Получить параметры, переданные в качестве аргументов любой из функций Wait...(), и посмотреть, что это за потокждетМожет быть еще один критический раздел, но может быть другой объект синхронизации.Попробуйте выяснить, кто является владельцем этой вещи.

Продолжайте так до тех пор, пока не вернетесь к теме 277c и не подтвердите цепочку тупиков.

Этот ручной подход может быть очень утомительным.Возможно, вы захотите попробовать автоматизированный анализ:

  • !analyze -hang может дать полезную информацию
  • !sosex.dlk может анализировать взаимоблокировки только между критическими секциями, но полностью (вы получаете всю информациюнеобходимо)
  • использовать отладить анализ зависания Diag
...