Если вы используете некоторые из наших классов с открытым исходным кодом, вы сможете найти имя любого символа.
Вам нужно будет создать файл .map
при сборке исполняемого файла, установив «Подробную карту» в параметре ваших проектов.
Затем вы можете доставить .map
с .exe
или сжать .map
в наш собственный .mab
формат, который можно добавить к .exe
. Формат .mab
намного эффективнее, чем .zip
или другой, для этой задачи: он примерно в 10 раз меньше исходного файла .map
(то есть намного меньше, чем предлагают JCLDebug или MaxExpect, и намного меньше). чем использование стандартной опции встраивания проекта «Символ удаленной отладки»).
Затем вы можете использовать класс TSynMapFile
для извлечения отладочной информации из файла .map
или информации, встроенной в .exe
:
function ExtractName(aSymbolAddress: pointer): string;
var i: integer;
begin
with TSynMapFile.Create do // no name supplied -> will read from .exe
try
i := FindSymbol(aSymbolAddress);
if i>=0 then
result := Symbols[i].Name else
result := '';
finally
Free;
end;
end;
Это будет работать для имен функций, но также и для любых других символов, таких как методы или глобальные переменные.
См. статью этого блога о классе. И обратите внимание, что даже если он используется нашей платформой mORMot или ее функциями ведения журнала, вам просто не нужно использовать всю платформу (только SynCommons.pas
и SynLZ.pas
единиц ). См. Программу Map2Mab.dpr в подпапке «SQLite3 \ Samples \ 11 - Exception logging» для встраивания содержимого файла .map в .exe.