Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

Как поставить точку остановки в управляемом коде?

У меня есть простая программа, которую я хочу отладить:
class Program { static void MyWrite() { System.Console.WriteLine("TEST!!!!!"); } static void Main(string[] args) { System.Console.WriteLine("PRE"); MyWrite(); System.Console.WriteLine("POST"); } }
Допустим, я хочу поставить точку остановки в начало исполнения MyWrite используя Windbg. Для этого я выполняю следующие шаги:
Открываю windbg Открываю ConsoleApplication1.exe файл Выполняю команду sxe ld:clr Выполняю команду g Выполняю команду .loadby sos clr Выполняю команду !bpmd ConsoleApplication1.exe ConsoleApplication1.Program.MyWrite
Последняя команда фейлится с сообщением
c0000005 Exception in C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.bpmd debugger extension. PC: 0a13b780 VA: 00000000 R/W: 0 Parameter: 00000000
Не понимаю, в чем ошибка.


Ответ

Для работы !bpmd нужен clrjit, а на момент загрузки clr его скорее всего нет. .loadby sos clr может глючить - криво загружать sos. Помогает .unload и еще один .loadby sos clr. Но указание прямого пути надежнее. У вас класс объявлен без namespace (т.е. он просто Program, а не ConsoleApplication1.Program, а брекпойнт вы пытаетесь ставить так, как будто бы namespace у вас есть). Может быть на самом деле и есть, просто вы код не весь привели.
Рабочая последовательность:
sxe ld:clrjit g .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll !bpmd ConsoleApplication1.exe Program.MyWrite()
.exe и () в последней строке опциональны, без них тоже должно работать.
Вывод должен выглядеть вот так:
0:000> !bpmd ConsoleApplication1.exe Program.MyWrite() Found 1 methods in module 00f03fdc... MethodDesc = 00f04d04 Adding pending breakpoints...
Если пишет просто
Adding pending breakpoints...
...значит вы не угадали с именем сборки, класса или метода.

Комментариев нет:

Отправить комментарий