Отладка тупика с помощью команды 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] 

person Maanu    schedule 21.08.2010    source источник
comment
Как указано ниже, эта команда просто используется для отображения стека управляемых вызовов для текущего контекста потока. Поэтому, если вы устраняете проблемы с взаимоблокировкой, вам следует попытаться объединить это с другими командами.   -  person Lex Li    schedule 21.08.2010
comment
Для меня это не похоже на тупик. В стеке отображается вызов Sleep. В случае тупиковой ситуации вы должны ожидать увидеть в стеке вызов Wait.   -  person Brian Rasmussen    schedule 25.08.2010


Ответы (3)


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

WinDbg / Памятка по SOS

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

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

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

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

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

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

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

 ~*e!clrstack 

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

person Mitch Wheat    schedule 21.08.2010
comment
Спасибо за ответ .. В моем приложении 2 потока. Но команда! Clrstack отображала стек вызовов только одного потока. Я просмотрел документы перед тем, как задать вопрос .. - person Maanu; 21.08.2010
comment
@Maanu, эта команда выдается для каждого потока. Чтобы выполнить его для всех потоков в вашем приложении, вам нужно будет использовать следующую команду: ~*e!clrstack (что в основном означает перебрать все потоки и выполнить команду '! Clrstack' для каждого из них). - person Liran; 22.08.2010

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

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

.load D:\sosex_32\sosex.dll

затем выпустить

!dlk

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

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

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

person wal    schedule 31.08.2010

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

person Russel Yang    schedule 21.08.2010