Отладка приложений


Интересная проблема разработки WDBG


Вообще у меня было мало неприятностей при разработке WDBG. Однако настало время обсудить одну, на мой взгляд, довольно интересную проблему. При работе с отладчиком Visual C++ окно Output показывает полные пути к загруженным программным модулям. Поскольку требовалось снабдить WDBG максимальным набором функциональных возможностей, в нем продублирована эта функция отладчика Visual C++. Но сделать это оказалось непросто.

Приведенное ниже определение структуры LOAD_DLL_DEBUG_INFO (она передается в отладчик при получении уведомлений LOAD_DLL_DEBUG_EVENT) содержит поле ipimageName, которое, по всей вероятности, должно хранить имя загружаемого модуля. Это так и есть, но ни одна из операционных систем Win32 никогда правильно не заполняет это поле при его считывании в программу.

typedef struct _LOAD_DLL_DEBUG_INFO

{

HANDLE hFile;

LPVOID IpBaseOfDll;

DWORD dwDebuglnfoFileOffset;

DWORD nDebuglnfoSize;

LPVOID IpimageName;

WORD fUnicode;

 } LOAD_DLL_DEBUG_INFO;

Поскольку при получении уведомления LOAD_DLL_DEBUG_EVENT, образно говоря, модуль загружается в символьную машину DBGHELP.DLL, то мне казалось, что после загрузки модуля (в память) легко можно отыскать его полное имя. API-функция SymGetModuieinfo получает (через соответствующий параметр) показанную ниже структуру IMAGEHLP_MODULE, где имеется место для  полного имени модуля (см. поле ModuleName[32]).

 На самом деле все, по-видимому, наоборот: это символьная машина загружает символьную информацию модуля в соответствующий символьный файл (в данном случае — в DBG-файл). — Пер

typedef struct _IMAGEHLP_MODULE {

DWORD SizeOfStruct;

DWORD BaseOfImage;

DWORD ImageSize;

DWORD TimeDateStamp;

DWORD Checksum;

DWORD NumSyms;

SYM_TYPE SymType;

CHAR ModuleName[32];

CHAR ImageName[256] ;

CHAR LoadedlmageName[256]; 

} IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;

Странная вещь: когда функция SymGetModuieinfo возвращает символьную информацию модуля, то вместо имени модуля либо возвращается имя символьного DBG-файла, либо ничего не возвращается (т.


Начало  Назад  Вперед



Книжный магазин