tokyo - delphi versiones
¿Cómo obtener el nombre del método actual en Delphi 7? (2)
Vea también nuestra clase TSynMapFile
.
Es capaz de cargar un archivo .map
y comprimirlo en un formato binario optimizado. Será mucho más pequeño que el propio .map
(por ejemplo, 900 KB .map
-> 70 KB .mab
). Este .mab
se puede incrustar fácilmente dentro del exe. Por lo tanto, es más pequeño que el formato utilizado por JCL o MadExcept, y también es más pequeño que la información incorporada en tiempo de compilación por Delphi.
Lo usarás como tal:
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;
Por ejemplo, así es como se usa en nuestras clases de registro.
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;
Este método puede recuperar la dirección de la persona que llama y registrar su nombre de unidad, nombre del método y número de línea.
¿Hay alguna manera de saber el nombre de un método en el que me encuentro actualmente?
Así que eso:
procedure TMyObject.SomeMethod();
begin
Writeln(''my name is: '' + <hocus pocus>);
end;
produciría esta salida:
my name is: SomeMethod
JCL es gratis y tiene funciones para eso. Depende de qué tan bien se pueda hacer un seguimiento de pila y cuánta información de depuración esté presente.
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;