Сборка WinDbg и .Net x64: пошаговое руководство по достижению точки останова в источнике C # - PullRequest
2 голосов
/ 02 мая 2011

Мне очень трудно использовать WinDbg для отслеживания простой ссылки на объект в приложении C # Forms. Я нашел очень хороший туториал Криса Ловетта: GCRoot Demo об использовании "SOS" в VS Immediate Window
К сожалению, я отлаживаю приложение x64 и перекомпилирую мое приложение в 32-битное смещение условий тестирования, которые я хочу воссоздать.

Попытка загрузки SOS в x64 Сборка приводит, как и ожидалось, к следующей ошибке:

Error during command: extension C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll could not load (error 193)

Итак, поскольку WinDbg, кажется, управляет x64, для меня это путь.
Однако заставить его работать с управляемым кодом - непростая задача.
Размещение простой точки останова в подключенном источнике приводит к следующей ошибке:

Unable to insert breakpoint 0 at 00000000 010e000f, Win32 error 0n998
"Invalid access to memory location."

Это согласуется с рекомендациями, данными Naveen Srinivasan.on его Blog
Однако, когда я пытаюсь использовать обходные пути ”sxe ld” / “.loadby sos” / ”.load sosex”, предложенные на той же веб-странице, я получаю следующую ошибку:

The call to LoadLibrary(sos) failed, Win32 error 0n2
The system cannot find the file specified.

Так что, я думаю, последние команды также связаны с SOS

Я также пытался следовать более старому посту из Эран Сэндлер , в котором объясняется, как именно установить точку останова в WinDbg для управляемого кода. Но я подозреваю, что команда name2ee, которую он использует, специфична для SOS, что делает ее довольно непригодной в моем случае (я получаю такую ​​же ошибку LoadLibrary).

Я действительно смущен и беспомощен. Я чувствую, что наталкиваюсь на стены в любом направлении Я на два дюйма далек от того, чтобы сдаться и перекомпилировать все приложение в 32-битное для его отладки, так как на этом я уже потерял почти 2 рабочих дня.

Все это только первый шаг к тому, чего я хочу достичь: отслеживание всех ссылок на объект "Trackee" в более сложном приложении с использованием gcroot.

Спасибо за помощь.



Пустой пример кода: DebugTest.cs:

namespace DebugTest
{    
    public partial class Form1 : Form
    {
        String Trackee;
        public Form1()
        {
            InitializeComponent();
            Trackee = "Where is Charlie";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = Trackee; // << Trying to put a breakpoint here
        }
    }
}


ОТВЕТ: Прохождение

1 -"loadby sos.dll clr" позволяет вызывать все вещи SOS. (включая команду «name2ee» для выполнения шагов Эрана Сэндлера.)
2 - Следующая команда эффективно устанавливает точку останова в управляемом коде некоторого метода. Пример: !bpmd DebugTEst.exe DebugTest.Form1.button1_Click
3 - Мне все еще не удается по-настоящему работать с визуальным отладчиком, поскольку точка останова логически достигается, как показано в окне команд, но не визуально в окне исходного кода.
4 - При воздействии на Trackee определенного типа ( MyString, например ) я смог отследить адрес объекта, используя
!DumpHeap -type myString которые дают следующий вывод:

  Address               MT              Size
0000000002bd33e0 000007ff000581d0       24 

5 - Затем, выполнив load vgcroot и !vgcroot 0000000002bd33e0 C:\graph.dgml, я смог найти и визуализировать все ссылки на моего Trackee.

...