Отладка тупика командой Windbg! Clrstack - PullRequest
8 голосов
/ 21 августа 2010

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

!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 ]

22 голосов
/ 31 августа 2010

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

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

.load D:\sosex_32\sosex.dll

, затем выполните

!dlk

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

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

См. также ссылка для ознакомления

16 голосов
/ 21 августа 2010

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

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

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

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

  • Опция -l показывает информацию о локальных переменных в кадре.Расширение отладки SOS не может получить локальные имена, поэтому выходные данные для локальных имен имеют формат =.

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

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

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

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

 ~*e!clrstack 

(что в основном означает «перебрать все потоки и выполнить команду«! clrstack »для каждого из них»).

1 голос
/ 21 августа 2010

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

...