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