2009-08-19 10 views

Antwort

27

JCL ist kostenlos und hat Funktionen dafür. Es hängt davon ab, wie gut ein Stack-Trace erstellt werden kann und wie viele Debug-Informationen vorhanden sind.

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

Ich füge hinzu, das kann einfach nicht ohne Debug-Informationen einer Art gemacht werden. –

6

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.

+0

Könnten Sie dies verwenden, um einen Aufruf-Stack von einem normalen Debug-Build zu protokollieren (oder mit einer externen Map zu veröffentlichen?), Ohne z. B. Jedi-Debug-Code hinzufügen zu müssen? Unter bestimmten Umständen könnte es sehr nützlich sein, einen Code zu haben, der protokollieren und berichten kann, wo er aufgerufen wurde. –

+0

@DavidM Ja, Sie können dies tun. Wenn keine .map/.mab-Datei angehängt ist, werden die hexadezimalen Adressen protokolliert. Dann ist unser LogView-Tool in der Lage, die Quellcodezeile aus einer vorhandenen .map-Datei, die der .exe-Datei entspricht, abzurufen. Aber da unser .mab-Format sehr klein ist, sehe ich keinen Grund, es nicht zur Compilierzeit in die .exe einzubetten. –

+0

@ArnaudBouchez Können Sie sagen, wie Sie es zur Kompilierzeit in die EXE einbetten? – SOUser

Verwandte Themen