Vedi anche our TSynMapFile
class.
È in grado di caricare un file .map
e comprimerlo in un formato binario ottimizzato. Sarà molto più piccolo dello .map
stesso (ad esempio 900 KB .map
-> 70 KB .mab
). Questo .mab
può essere facilmente incorporato all'interno dell'exe. È quindi più piccolo del formato utilizzato da JCL o MadExcept e anche più piccolo delle informazioni incorporate in fase di compilazione da Delphi.
Potrai utilizzare come tale:
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;
Per esempio, ecco come viene utilizzato dai nostri corsi di registrazione.
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;
Questo metodo è in grado di recuperare l'indirizzo del chiamante e registrare il nome dell'unità, il nome del metodo e il numero di riga.
fonte
2012-05-30 17:25:43
Aggiungerò semplicemente che non può essere eseguito senza informazioni di debug di qualche tipo. –