Отладка тупика с Windbg!команда clrstack

когда я выдал команду clrstack,я получил следующий вывод. Это callstack блокирующего потока, который владеет взаимоблокировкой и приводит к взаимоблокировке. Это его точная цель? Имеет ли он какие-либо другие цели (без каких-либо параметров). Где я могу получить больше информации?

!clrstack
OS Thread Id: 0x1b2c (6956)
ESP       EIP     
0012f370 7c90e514 [HelperMethodFrame: 0012f370] System.Threading.Thread.SleepInternal(Int32)
0012f3c4 79299275 System.Threading.Thread.Sleep(Int32)
0012f3c8 00e0030f testlock.LockTest.Test()
0012f420 00e00146 testlock.Program.Main(System.String[])
0012f69c 79e71b4c [GCFrame: 0012f69c] 

3 ответов


как: отлаживать тупики с помощью Windbg?

шпаргалка WinDbg / SOS

CLRStack [- a] [- l] [- p] [- n] обеспечивает трассировка стека только управляемого кода.

  • параметр-p показывает аргументы управляемая функция.

  • опция-l показывает информацию о локальные переменные в кадре. сигнал бедствия Не удается получить расширение отладки местный имена, поэтому вывод для local имена в формате = .

  • опция-a (all) является ярлыком для - l и-pcombined.

  • параметр-n отключает отображение имена исходных файлов и номера строк. Если отладчик имеет возможность Symopt_load_lines указано, SOS будет найдите символы для каждого управляемого рамка и в случае успеха будет отображаться соответствующее имя исходного файла и номер строки. The-n (без строки числа) параметр можно указать для отключения такое поведение.

расширение отладки SOS не отображение кадров перехода на x64 и Платформы на базе IA-64.

обновление: (благодаря @Liran): чтобы просмотреть стеки вызовов для всех потоков в приложении, выполните следующую команду:

 ~*e!clrstack 

(что в основном означает: "повторите все потоки и выполните команду"!clrstack на каждый один из них.)"


использовать sosex Стив Джонсон. У этого есть команда, чтобы обнаружить тупики для вас.

загрузите расширение по ссылке и загрузите его, например

.load D:\sosex_32\sosex.dll

затем проблема

!dlk

пример вывода (взято с сайта Стива)

0:010> !обнаружен тупик dlk: поток CLR 4 содержит блок синхронизации 00000000024c6970 OBJ:000000007fff0f80[система.String] STRVAL=SYNC1 блок синхронизации ожидания 00000000024c6928 OBJ: 000000007fff0fa8[система.String] STRVAL=SYNC2 CLR поток 5 удерживает блок синхронизации 00000000024c6928 OBJ:000000007fff0fa8[система.Строка] STRVAL=SYNC2 ожидает блока синхронизации 00000000024c6970 OBJ: 000000007fff0f80[System.String] STRVAL=SYNC1 поток CLR 4 является ожидания на ConsoleTestApp.ConsoleTestApp.MonitorDeadlockThreadProc ()+0xa4 (IL) [C:\dev\ConsoleTestApp\ConsoleTestApp.cs, строка 195] поток CLR 5 ожидания на ConsoleTestApp.ConsoleTestApp.MonitorDeadlockThreadProc ()+0xa4 (IL) [C:\dev\ConsoleTestApp\ConsoleTestApp.cs, строка 195]

см. также ссылке для прохождения


Тесс в блоге много полезной информации о windbg. Вот один в должности что может помочь.