繁体   English   中英

如何在 Delphi 7 中获取当前方法的名称?

[英]How to get current method's name in Delphi 7?

有什么方法可以知道我当前使用的方法的名称吗?

以便:

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

会产生这个 output:

my name is: SomeMethod

JCL是免费的,并且具有相应的功能。 它确实取决于可以进行堆栈跟踪的程度以及存在多少调试信息。

调试文件

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 处访问更新的文档。

如果你有 EurekaLog:

uses
  EDebugInfo;

procedure TMyObject.SomeMethod();
begin
  Writeln('my name is: ' + __FUNCTION__); 
end;

还有__FILE____MODULE____UNIT____LINE__以及通用的GetLocationInfoStr function。

然而:

  1. 它仅在您使用一些调试信息进行编译时才有效(并且启用了相应的调试信息提供程序):
  • EurekaLog 有自己的调试信息格式,可以选择压缩(实际上不推荐,因为你会花费更多的 memory 和 CPU)。
  • 它还支持 JCL/JEDI、Synopse/MAB,以及 .map、.tds/TD32、.dbg、.pdb。
  1. 不是一个常数。 该名称将被动态查找,因此它有一些运行时成本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM