[0266CB17] BalloonHint.TBalloonHint.SetVisible (строка 281, «BalloonHint.pas») + $ 0

ли способ получить доступ кДжедай отладочная информация (JDBG) содержится в исполняемом файле?

Инструменты отладки Microsoft указали мне на цепочку стеков в моем двоичном файле, и я хочу знать, каким методам / процедурам / функциям соответствуют эти смещения:

user32.dll!SendMessageA+0x4c
StackOverflow.exe+0x179263
StackOverflow.exe+0x2315b5
StackOverflow.exe+0x1fc82
StackOverflow.exe+0x50388
StackOverflow.exe+0x541fe
user32.dll!gapfnScSendMessage+0x332

Очевидно, я звонюSendMessageно я не знаю откуда. Исполняемый файл был собран с информацией отладки Jcl, встроенной в исполняемый файл; но я не могу понять, как это читать.

Рассматривая некоторые функции и классы вJclDebug.pasкажется, все ориентировано на получение отладочной информации внутри текущего процесса, например:

function GetLocationInfo(const Addr: Pointer; var Info: TJclLocationInfo): Boolean;

занимает адрес в адресном пространстве моего текущего процесса. Это цифры, которыеHMODULE адрес находится, например:

Stackoverflow.exeGDI32.dllUSER32.dllKERNELBASE.dlldwmapi.dlluXTheme.dll

я думал, что смогу использоватьLoadLibrary (который возвращаетHMODULE) вручную загрузить модуль, а затем передать его некоторым классам, которые копают образы модулей для получения информации об отладке:

module := LoadLibrary('C:\Users\Ian\Desktop\StackOverflow.exe');

а также

TJclDebugInfoList = class(TObjectList)
private
   function GetItemFromModule(const Module: HMODULE): TJclDebugInfoSource;
   ...
protected
   function CreateDebugInfo(const Module: HMODULE): TJclDebugInfoSource;
   ...
end;

кроме того, что это защищено.

Я пытаюсь (надеюсь), я могу написать инструмент, где я выбираю двоичный файл (* .exe), введите адрес и получить

функцияметодфайлномер строчки

смещения.

например

[002315B5] FMain.TfrmMain.lvQuestions (Line 158, "FMain.pas" + 1) + $11

Возможно?

Редактировать: Моим первым грубым и готовым подходом было просто извлечь сжатыйmap файл, чтобы я мог посмотреть на него. Но это не сохраняется как ресурс (?):

Хотя общий инструмент будет более полезным:

Обновить:

я пытался использоватьTJclDebugInfoList; я понял, что свойство массиваItemFromModule получит доступ к защищенному методу:

function GetModuleLocationInfo(filename: string; Addr: Pointer): TJclLocationInfo;
var
   module: HMODULE;
   infoList: TJclDebugInfoList;
   infoSource: TJclDebugInfoSource;

   Address: Pointer;
   locationInfo: TJclLocationInfo;
   AddressOffset: Integer;
begin
   module := LoadLibrary(filename);
   if module = 0 then
      RaiseLastWin32Error;
   try
      infoList := TJclDebugInfoList.Create;
      try
         infoSource := infoList.ItemFromModule[module];
         if source = nil then
            raise Exception.Create('Could not find debug info source for module '+IntToStr(module));
         if not source.GetLocationInfo(Addr, {var}locationInfo) then
            raise Exception.Create('Could not get location info for address 

За исключением того, что код в одном изTJclDebugInfoSource Классы-потомки получают недостаточное значение, когда пытаются преобразовать виртуальный адрес в адрес смещения.

+IntToHex(Integer(Address), 8)); Result := locationInfo; finally infoList.Free; end; finally FreeLibrary(module); end; end;

За исключением того, что код в одном изTJclDebugInfoSource Классы-потомки получают недостаточное значение, когда пытаются преобразовать виртуальный адрес в адрес смещения.

Ответы на вопрос(3)

Ваш ответ на вопрос