Siehe auch our TSynMapFile
class.
Es ist in der Lage, eine .map
Datei zu laden und in ein optimiertes Binärformat zu komprimieren. Es wird viel kleiner sein als das .map
selbst (z. B. 900 KB .map
-> 70 KB .mab
). Diese .mab
kann leicht in die exe eingebettet werden. Es ist daher kleiner als das von JCL oder MadExcept verwendete Format und auch kleiner als die Informationen, die Delphi bei der Kompilierung einfügt.
Sie werden als solche verwendet werden:
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;
Zum Beispiel ist hier, wie es aus unserer Protokollierungs Klassen verwendet wird.
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;
Diese Methode kann die Adresse des Anrufers abrufen und seinen Gerätenamen, den Methodennamen und die Zeilennummer protokollieren.
Ich füge hinzu, das kann einfach nicht ohne Debug-Informationen einer Art gemacht werden. –