Как получить имя текущего метода в Delphi 7? - PullRequest
23 голосов
/ 19 августа 2009

Есть ли способ узнать название метода, в котором я сейчас нахожусь?

Так что:

procedure TMyObject.SomeMethod();
begin
  Writeln('my name is: ' + <hocus pocus>); 
end;

выдаст такой вывод:

my name is: SomeMethod

Ответы [ 2 ]

27 голосов
/ 19 августа 2009

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;
7 голосов
/ 30 мая 2012

См. Также наш TSynMapFile класс .

Он может загрузить файл .map и сжать его в оптимизированный двоичный формат. Он будет намного меньше, чем сам .map (например, 900 КБ .map -> 70 КБ .mab). Этот .mab может быть легко встроен в исполняемый файл. Поэтому он меньше, чем формат, используемый 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;

Этот метод может получить адрес вызывающего абонента и записать имя его устройства, имя метода и номер строки.

...