Когда я выполнил команду 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]
Как: отлаживать взаимоблокировки с помощью Windbg?
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' для каждого из них ").
Используйте 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]
См. также эту ссылку для пошагового руководства