Мне очень трудно использовать 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.