Подтвердить что ты не робот

Как получить имя текущего метода в Delphi 7?

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

Итак, чтобы:

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

будет производить этот вывод:

my name is: SomeMethod

4b9b3361

Ответ 1

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;

Ответ 2

См. также наш 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;

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