28

現在使用しているメソッドの名前を知る方法はありますか?

となることによって:

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

この出力を生成します:

my name is: SomeMethod

4

2 に答える 2

31

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;
于 2009-08-19T17:10:41.703 に答える
11

私たちのTSynMapFileクラスも参照してください。

ファイルをロード.mapし、最適化されたバイナリ形式に圧縮することができます。それ自体よりもはるかに小さくなり.mapます(たとえば、900 KB- .map> 70 KB .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;

このメソッドは、呼び出し元のアドレスを取得し、そのユニット名、メソッド名、および行番号をログに記録することができます。

注/編集:mORMotログユニットのソースコードはSynLog.pasです。更新されたドキュメントは、このURIで到達可能です。

于 2012-05-30T17:25:43.400 に答える