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

Когда я выполнил команду 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] 
8
задан Mitch Wheat 21 August 2010 в 05:49
поделиться

3 ответа

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

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

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

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

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

  • Параметр -a (all) - это ярлык для -l и -p объединены.

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

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

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

 ~*e!clrstack 

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

16
ответ дан 5 December 2019 в 04:51
поделиться

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

1
ответ дан 5 December 2019 в 04:51
поделиться

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

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

.load D:\sosex_32\sosex.dll

, затем введите

!dlk

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

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

См. также эту ссылку для пошагового руководства

22
ответ дан 5 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: