Voir aussi our TSynMapFile
class.
Il est capable de charger un fichier .map
et de le compresser dans un format binaire optimisé. Il sera beaucoup plus petit que le .map
lui-même (par exemple 900 KB .map
-> 70 KB .mab
). Ce .mab
peut être facilement intégré dans l'exe. Il est donc plus petit que le format utilisé par JCL ou MadExcept, et aussi plus petit que les informations intégrées à la compilation par Delphi.
Vous allez l'utiliser en tant que tel:
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;
Par exemple, voici comment il est utilisé de nos cours d'exploitation forestière.
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;
Cette méthode est en mesure de récupérer l'adresse de l'appelant, et connectez-vous son nom de l'unité, le nom de la méthode et le numéro de ligne.
Je vais ajouter cela ne peut tout simplement pas être fait sans informations de débogage d'une certaine sorte. –