2009-08-19 5 views

Odpowiedz

27

JCL jest wolny i ma funkcje do tego. Zależy to od tego, jak dobrze można utworzyć śledzenie stosu i ile informacji o debugowaniu jest obecnych.

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

Dodam to po prostu nie da się zrobić bez jakiegoś rodzaju informacji debugowania. –

6

Zobacz także our TSynMapFile class.

Jest w stanie załadować plik .map i skompresować go do zoptymalizowanego formatu binarnego. Będzie on znacznie mniejszy niż sam plik .map (np. 900 KB, .map -> 70 KB, .mab). Ten .mab może być łatwo osadzony w exe. Jest zatem mniejszy niż format używany przez JCL lub MadExcept, a także mniejszy niż informacje osadzone w czasie kompilacji przez Delphi.

Będziesz używać go jako takie:

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; 

Na przykład, tutaj jest jak jest ona wykorzystywana od naszych klasach logowania.

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; 

Ta metoda umożliwia pobranie adresu osoby dzwoniącej i zarejestrowanie jej nazwy jednostki, nazwy metody i numeru linii.

+0

Możesz użyć tego do logowania stosu wywołań z normalnej wersji debugowania (lub wydania z zewnętrzną mapą?) Bez konieczności dodawania np. Kodu debugowania Jedi? W pewnych szczególnych okolicznościach może być bardzo użyteczne posiadanie kodu, który może się logować i raportować skąd został wywołany. –

+0

@DavidM Tak, możesz to zrobić. Jeśli nie ma załączonego pliku .map/.mab, rejestrowałby adresy szesnastkowe. Następnie nasze narzędzie LogView jest w stanie pobrać linię kodu źródłowego z istniejącego pliku .map pasującego do .exe. Ale oczywiście, ponieważ nasz format .mab jest bardzo mały, nie widzę powodu, aby nie osadzać go w .exe podczas kompilacji. –

+0

@ArnaudBouchez Czy możesz powiedzieć, jak umieścić go w .exe podczas kompilacji? – SOUser