Zobacz także our TSynMapFile
class.
Jest w stanie załadować plik .map
i skompresować go do zoptymalizowanego formatu binarnego. Będzie on znacznie mniejszy niż sam plik .map
(np. 900 KB, .map
-> 70 KB, .mab
). Ten .mab
może być łatwo osadzony w exe. Jest zatem mniejszy niż format używany przez JCL lub MadExcept, a także mniejszy niż informacje osadzone w czasie kompilacji przez Delphi.
Będziesz używać go jako takie:
Map := TSynMapFile.Create; // or specify an exe name
try
i := Map.FindSymbol(SymbolAddr);
if i>=0 then
writeln(Map.Symbols[i].Name);
// or for your point:
writeln(Map.FindLocation(Addr)); // e.g. 'SynSelfTests.TestPeopleProc (784)'
finally
Map.Free;
end;
Na przykład, tutaj jest jak jest ona wykorzystywana od naszych klasach logowania.
procedure TSynLog.Log(Level: TSynLogInfo);
var aCaller: PtrUInt;
begin
if (self<>nil) and (Level in fFamily.fLevel) then begin
LogHeaderLock(Level);
asm
mov eax,[ebp+4] // retrieve caller EIP from push ebp; mov ebp,esp
sub eax,5 // ignore call TSynLog.Enter op codes
mov aCaller,eax
end;
TSynMapFile.Log(fWriter,aCaller); // here it will call TSynMapFile for the current exe
LogTrailerUnLock(Level);
end;
end;
Ta metoda umożliwia pobranie adresu osoby dzwoniącej i zarejestrowanie jej nazwy jednostki, nazwy metody i numeru linii.
Dodam to po prostu nie da się zrobić bez jakiegoś rodzaju informacji debugowania. –