У меня есть простая программа, которую я хочу отладить:
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...
...значит вы не угадали с именем сборки, класса или метода.
Комментариев нет:
Отправить комментарий