Есть ли способ узнать имя метода, в котором я сейчас?
Итак, чтобы:
procedure TMyObject.SomeMethod();
begin
Writeln('my name is: ' + <hocus pocus>);
end;
будет производить этот вывод:
my name is: SomeMethod
Есть ли способ узнать имя метода, в котором я сейчас?
Итак, чтобы:
procedure TMyObject.SomeMethod();
begin
Writeln('my name is: ' + <hocus pocus>);
end;
будет производить этот вывод:
my name is: SomeMethod
JCL является бесплатным и имеет для этого функции. Это зависит от того, насколько хорошо можно сделать трассировку стека и сколько отладочной информации присутствует.
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;
См. также наш TSynMapFile
класс.
Он может загрузить файл .map
и сжать его в оптимизированный двоичный формат. Он будет намного меньше самого .map
(например, 900 КБ .map
→ 70 КБ .mab
). Этот .mab
может быть легко встроен в exe. Поэтому он меньше, чем формат, используемый JCL или MadExcept, а также меньше, чем информация, встроенная во время компиляции Delphi.
Вы будете использовать его как таковое:
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;
Например, вот как он используется из наших классов ведения журнала.
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;
Этот метод способен получить адрес вызывающего абонента и записать его имя, имя метода и номер строки.