Visual Studio 2008: как просмотреть разобранный код для библиотеки DLL, которая не выполняется в данный момент - PullRequest
6 голосов
/ 28 января 2010

Я использую Visual Studio 2008, чтобы отследить ошибку в процессе выполнения. Я подключился к процессу и определил интересующий модуль. (Бывает, что символы отладки для этого модуля были загружены из файла pdb.) Я хочу показать дизассемблированный код в окне Разборка, чтобы я мог решить, где установить точку останова.

Когда я прерываю процесс, текущий исполняемый модуль отображается в окне «Разборка». К сожалению, это не модуль интереса. Я не могу понять, как показать код для интересующего модуля, пока он не выполняется.

Ответы [ 3 ]

5 голосов
/ 28 января 2010

Предполагается, что вы отлаживаете неуправляемый процесс ...

Когда вы «Отладить / Разбить все», выполните следующие действия:

Выберите «Отладка / Windows / Модули», чтобы получить список всех загруженных модулей. Под столбцом «Адрес» в окне «Модули» находится диапазон памяти для этого модуля. В поле «Адрес:» в окне разборки введите начальный адрес для модуля (обязательно добавьте 0x перед номером)

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

Вот пример:

Запустить sol.exe Присоединяйся к процессу и ломай все. Посмотрите на модули и найдите «cards.dll», вы увидите, что он загружается на 6fc10000 (на моем компьютере, в любом случае).

Введите этот адрес (0x6fc10000) в окне разборки, и он приведет вас к запуску модуля.

Теперь скажите, что я хочу перейти к функции. Откройте DLL в Dependency Walker (зависимость.exe), чтобы получить смещения функций. В моем примере я хочу установить точку останова для функции "cdInit". В Dependecny Walker это показывает, что смещение экспортируемой функции cdInit равно 0x000013e6. Таким образом, чтобы добраться до этой функции, я бы добавил начальный адрес модуля (0x6fc10000) к смещению (0x000013e6), чтобы получить 0x6fc113e6.

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

1 голос
/ 28 января 2010

Делать подобные вещи проще далеко в WinDbg

uf cards!cdInit
0 голосов
/ 28 января 2010

Вы пробовали использовать .Net Reflector? Вы можете получить весь код из вашей DLL и, возможно, даже перекомпилировать его с отладочными сообщениями. Это бесплатно:

http://www.red -gate.com / продукты / отражатель /

Приветствия

...