Страницы

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

суббота, 16 марта 2019 г.

Как при наличии отладочных символов только своей dll получить её переменные из дампа памяти приложения?

Есть моя DLL библиотека (проект Visual Studio 2013). Ее используют чужие программы. Во время работы этих программ было сохранено несколько полных дампов память процессов этих программ. Я открываю эти дампы в моем Visual Studio проекте. Отладочные символы я имею только для моей DLL. При этом, если во время сохранения дампа исполнялся код одной из функций моей DLL, то видно все символы в исходном коде, место текущего исполнения итд. Но если, исполнялся другой код, я никаких данных не вижу и посмотреть текущее значение переменных моей DLL не могу. Локальные переменные ясное дело недоступны, так как их нет, но и статические данные тоже не видны.
Как просматривать данные моей DLL?


Ответ

Не уверен, можно ли это сделать через студию. Но точно можно через WinDBG:
Открыть дамп. Включить ссылки в выводе:
.prefer_dml 1 Прописать путь к символам:
.sympath+ srv* Загрузить SOS (пусть исправить на соответствующий версии и платформе)
для 4.0:
.loadby sos clr
для <4.0
.loadby sos mscorwks
или по полному пути
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll Найти EEClass для того типа, для которого хочется посмотреть статические поля
> !name2ee mscorlib.dll System.Console Module: 0000064278854000 (mscorlib.dll) Token: 0x000000000200008b MethodTable: 00000642788c8d10 EEClass: 0000064278a271a8 Name: System.Console Посмотреть статические поля:
> !dumpclass 0000064278a271a8 Class Name: System.Console mdToken: 000000000200008b (C:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll) Parent Class: 00000642788c0c30 Module: 0000064278854000 Method Table: 00000642788c8d10 Vtable Slots: 4 Total Method Slots: 78 Class Attributes: 100181 Abstract, NumInstanceFields: 0 NumStaticFields: d MT Field Offset Type VT Attr Value Name 00000642788f5aa0 40002ae d8 System.IO.TextReader 0 shared static _in
Дальше перемещаться кликами по адресам объектов - в режиме DML по клику будет выполнятся соответствующая команда для дампа объекта.
По настройке WinDBG есть отличный мануал Debugging Managed Code Using the Windows Debugger.

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

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