Как я могу выучить WinDbg?(re: казалось бы, простой зависший процесс) - PullRequest
7 голосов
/ 18 октября 2010

Я пытаюсь определить, почему процесс зависает, и изучаю различные инструменты, такие как Process Explorer , Process Monitor и WinDbg .

В любом случае, я пытаюсь использовать WinDbg, и после подключения к моему процессу отладчик говорит следующее:

(1e9c.1128): Break instruction exception - code 80000003 (first chance)
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77c5c964 esi=00000000 edi=00000000
eip=77c18b2e esp=0543ff5c ebp=0543ff88 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
77c18b2e cc              int     3

Если я запускаю !analyze -v, он отображает это:

FAULTING_IP: 
ntdll!DbgBreakPoint+0
77c18b2e cc              int     3

Я разработчик программного обеспечения (VB.NET / C #), не имеющий опыта в этом уровне отладки, поэтому я не уверен, что делаю, но похоже, что WinDbg подключается к моему процессуа потом сразу ломается.Затем, когда я делаю анализ, он думает, что точка останова (которую он только что установил) является проблемой с приложением?

Как я должен использовать WinDbg, чтобы просто присоединяться к процессу и анализировать его?

(Кроме того, есть ли хорошие книги / учебные пособия для начала работы с этим уровнем отладки и WinDbg?)

Ответы [ 4 ]

9 голосов
/ 19 октября 2010

WinDbg является отладчиком режима пользователя и ядра, но сам по себе он не совсем понимает управляемый код, и поэтому команда !analyze имеет ограниченное использование. Если вы хотите отлаживать управляемые приложения с помощью WinDbg, вам нужен какой-то способ, чтобы WinDbg понимал внутреннюю структуру управляемого кода. Есть ряд расширенных DLL, которые позволяют это. .NET Framework поставляется с sos.dll, и есть такие загрузки, как psscor2.dll и sosex.dll .

SOS и PSSCOR2 предоставляют более или менее одинаковые функции, в то время как SOSEX добавляет новые функции для управляемой отладки. Файлы справки для каждого из них доступны в WinDbg. Например. чтобы получить справку по SOS, вы можете использовать команду !sos.help.

Вы должны загрузить SOS или PSSCOR2 и, возможно, SOSEX для отладки управляемого приложения с WinDbg. Например. если вы хотите загрузить SOS, вы используете команду загрузки, подобную этой

.loadby sos clr

Это загрузит SOS из местоположения среды выполнения .NET. Обратите внимание, что среда выполнения называется mscorwks в .NET 2 и coreclr в Silverlight, поэтому, если вы используете любой из них, вам необходимо соответствующим образом изменить команду .loadby.

WinDbg нужны символы для отображения дополнительной информации. Это особенно важно для неуправляемого кода. Вы можете использовать команду .symfix, чтобы WinDbg мог получать символы по мере необходимости с сервера символов Microsoft.

Поскольку ваше приложение зависает, есть большая вероятность, что у вас будет один или несколько заблокированных потоков. Вы можете просматривать управляемые потоки, используя команду !threads (или просто !t). В .NET простые блокировки реализуются внутренне с помощью структуры, называемой SyncBlocks. Вы можете просмотреть их с помощью команды !syncblk. Если вы загрузили SOSEX, команда !dlk может автоматически обнаруживать взаимоблокировки.

Если вам нужна дополнительная информация, прочитайте пару книг и несколько блогов.

Книга:

Блоги

  • Блог Тесс отлично. Он имеет множество учебных пособий и лабораторий, которые вы можете использовать на практике.
  • Блог Тома также очень полезен.

Видео:

  • Я сделал презентацию по управляемой отладке в центре разработки Microsoft в Дании. Видео доступно на канале р. Часть 1 и Часть 2 .
5 голосов
/ 18 октября 2010

Расширенная отладка Windows будет хорошим началом.

Когда Windbg подключается к процессу, он добавляет поток, который вызывает DbgBreakPoint. Это то, что вы видите. Вы можете использовать ~, чтобы увидеть запущенные потоки, а затем ~ n, чтобы переключиться на другой поток. k даст вам трассировку стека текущего потока, что должно дать вам некоторое представление о зависании.

5 голосов
/ 18 октября 2010

Блог Тесс Феррандез - фантастический ресурс для материала .NET WinDbg:

Если он сломан, исправьте его, как следует

Хотя многие ее статьи нацелены на сбой, зависания и утечки рабочих процессов IIS / ASP.NET, большинство методов можно применять ко всем видам сценариев.

3 голосов
/ 18 октября 2010

Инструкция int 3 (cc в двоичном формате) является одним из способов, которыми отладчики устанавливают точки останова в приложении. Эта инструкция генерирует прерывание, которое приостанавливает выполнение программы и дает отладчику возможность реагировать на это прерывание. Вам просто нужно продолжить выполнение, пока не дойдете до места, где висит ваша программа.

...