Вопрос, поставленный пользователем, заключается в возможности доступа к отладочной информации Jedi (JDBG), содержащейся в исполняемом файле. Эта информация может быть полезна для определения функций, методов и строк, на которых выполняется код в момент сбоя программы. Пользователь уже имеет встроенную отладочную информацию в свой исполняемый файл, но не знает, как её извлечь.
Как получить доступ к JDBG в Delphi
Для начала стоит отметить, что информация для отладки в Delphi хранится не в ресурсах, а в отдельном разделе исполняемого файла с названием JCLDEBUG. Для работы с этой информацией можно использовать классы из модуля JclDebug.pas.
Пользователь пытался использовать функцию LoadLibrary для загрузки исполняемого файла и последующего анализа, но столкнулся с ошибками в работе с адресами. В качестве решения предлагается использовать объект TJclDebugInfoBinary, созданный с помощью HMODULE, полученного через LoadLibrary. Затем необходимо вызвать метод GetLocationInfo для получения необходимой информации.
Пример кода для получения информации о модуле
function GetModuleLocationInfo(filename: string; AddressOffset: Pointer; AssumeOffsetIsRelativeToStartOfCodeSection: Boolean=False): TJclLocationInfo;
var
module: HMODULE;
infoList: TJclDebugInfoList;
infoSource: TJclDebugInfoSource;
Address: Pointer;
locationInfo: TJclLocationInfo;
begin
// Код является общественным достоянием, указание источника не требуется.
module := LoadLibrary(PChar(filename));
if module = 0 then
RaiseLastWin32Error;
try
infoList := TJclDebugInfoList.Create;
try
infoSource := infoList.ItemFromModule[module];
if infoSource = nil then
raise Exception.Create('Не удалось найти источник отладочной информации для модуля ' + IntToStr(module));
DWORD(Address) := DWORD(AddressOffset) + DWORD(module) + DWORD(ModuleCodeOffset);
if not infoSource.GetLocationInfo(Address, {var}locationInfo) then
raise Exception.Create('Не удалось получить информацию о расположении для адреса $' + IntToHex(Integer(Address), 8));
Result := locationInfo;
finally
infoList.Free;
end;
finally
FreeLibrary(module);
end;
end;
Важные моменты
Необходимо учитывать, что базовый адрес модуля при загрузке может отличаться от базового адреса во время сбоя. Поэтому при работе с адресами может потребоваться их корректировка.
Пользователь также упомянул, что кодовые смещения в карте Delphi (.map) не относятся к началу образа, а к точке, расположенной на расстоянии +0x1000 от начала. Это также следует учитывать при работе с адресами.
Альтернативный способ
Пользователь также упомянул, что ранее разработал инструмент для работы с отладочной информацией, который может быть полезен. Кроме того, упоминаются инструменты, созданные на основе JclDebug.pas, такие как "Live Process Stack Viewer" и "Minidump reader", которые могут быть использованы для анализа сбоев.
Заключение
Для работы с отладочной информацией JDBG в Delphi можно использовать классы из модуля JclDebug.pas. Важно правильно обрабатывать адреса, учитывая базовые адреса модулей и смещения в карте. Существуют также сторонние инструменты, которые могут помочь в этом процессе.
Вопрос касается получения доступа к отладочной информации JDBG в среде разработки Delphi, используя специальные классы и методы для работы с исполняемыми файлами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.