[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
адрес находится, например:
я думал, что смогу использовать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
Классы-потомки получают недостаточное значение, когда пытаются преобразовать виртуальный адрес в адрес смещения.