現在使用しているメソッドの名前を知る方法はありますか?
となることによって:
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 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で到達可能です。