2009-08-19 10 views

Répondre

27

JCL est gratuit et a des fonctions pour cela. Cela dépend de la façon dont une trace de pile peut être faite et combien d'informations de débogage sont présentes.

JclDebug.pas

function FileByLevel(const Level: Integer = 0): string; 
function ModuleByLevel(const Level: Integer = 0): string; 
function ProcByLevel(const Level: Integer = 0): string; 
function LineByLevel(const Level: Integer = 0): Integer; 
+14

Je vais ajouter cela ne peut tout simplement pas être fait sans informations de débogage d'une certaine sorte. –

6

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.

+0

Pourriez-vous l'utiliser pour consigner une pile d'appels à partir d'une version de débogage normale (ou d'une version avec une carte externe?) Sans avoir à ajouter, par exemple, du code de débogage Jedi? Dans certaines circonstances spécifiques, il peut être très utile d'avoir du code qui puisse se connecter et rapporter d'où il a été appelé. –

+0

@DavidM Oui, vous pouvez le faire. S'il n'y a pas de fichier .map/.mab attaché, il consignera les adresses hexadécimales. Ensuite, notre outil LogView est capable de récupérer la ligne de code source d'un fichier .map existant correspondant au fichier .exe. Mais bien sûr, puisque notre format .mab est très petit, je ne vois aucune raison de ne pas l'incorporer au fichier .exe, au moment de la compilation. –

+0

@ArnaudBouchez Pouvez-vous dire comment l'intégrer au fichier .exe lors de la compilation? – SOUser

Questions connexes