Отладка тупика командой! Dlk возвращает неизвестное имя потока - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь отладить тупик в своем процессе с помощью команды SOSEX! Dlk Я получаю следующий вывод:

*DEADLOCK DETECTED*

CLR thread 0xac holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]
and is waiting for the lock on SyncBlock 00000012ae4ba6b8 OBJ:00000012808391f8[System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib],[CaptureServices.GenericInfrastructure.Controlling.CapManager.MO.CallRecorder.ICallRecorder, Capture Manager]]]

CLR thread 0x9a holds the lock on SyncBlock 00000012ae4ba6b8 OBJ:00000012808391f8[System.Collections.Generic.Dictionary`2[[System.Guid, mscorlib],[CaptureServices.GenericInfrastructure.Controlling.CapManager.MO.CallRecorder.ICallRecorder, Capture Manager]]]
and is waiting for the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]

Я хотел бы иметь возможность получить стек вызовов этих потоков, ноЯ не могу найти идентификаторы потоков (0xac, 0x9a) в списках потоков.Я попробовал следующие команды, и вышеупомянутые потоки не перечислены ни в одном из результатов:

  1. ~ - должен отображать все потоки (управляемые и неуправляемые)
  2. ~ * e! Clrstack - должен отображать стек вызовов всех потоков
  3. ~ * e! Dumpstack - выводить все управляемые потоки

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

спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Статья , следующая за ней , помогла мне прочитать результаты команды! Dlk.согласно статье, если, например, мы обнаружили тупик в потоке 0xac:

CLR **thread 0xac** holds the lock on SyncBlock 00000012ac132068 OBJ:00000012830d66a0[System.Object]

Результаты команды! thread имеют 3 столбца «идентификаторов»:

  1. логический потокID (1-й столбец)
  2. ID CLR (2-й столбец)
  3. OSID (3-й столбец)

Идентификатор потока в! Dlk на самом деле является идентификатором CLR в! Результаты потоков: (ac) = 172. Идентификатор CLR 172 является потоком 177.

0:000> !threads
                                                                                                        Lock  
       ID OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception
 177  172 1188 00000012abfcaee0  3029220 Preemptive  0000000000000000:0000000000000000 00000012f0e94d70 3     MTA (Threadpool Worker) 

теперь я мог переключиться на поток 177 с помощью команды: ~ 177s

и посмотреть стек вызовов потока командой: ! clrstack

...