Mar*_*der 13 delphi callstack stack-trace madexcept jedi-code-library
我正在开发一个非常大的应用程序,我会定期将ENTIRE调用堆栈记录到当前执行点(不是例外).这里的想法是,我想要一张确切的代码路径的地图,这使我成为我的观点.我一直在使用madExcept,使用jclDebug,虽然我可以获得一些调用堆栈,但我似乎无法获得在应用程序中进行的每个方法/过程/函数调用以显示在日志中.
我在项目中启用了堆栈帧,调试信息等.我甚至尝试在没有包含在调用堆栈中的各个方法上打开堆栈帧无济于事.
我正在努力做甚么可能吗?我真的试图避免在数百万行代码中添加日志代码以便记录代码路径.
Rob*_*ove 23
我使用JCL的 JCLDebug 来做到这一点.
以下将获取当前位置的调用堆栈并将其作为字符串返回.
function GetCurrentStack: string;
var
stackList: TJclStackInfoList; //JclDebug.pas
sl: TStringList;
begin
stackList := JclCreateStackList(False, 0, Caller(0, False));
sl := TStringList.Create;
stackList.AddToStrings(sl, True, True, True, True);
Result := sl.Text;
sl.Free;
stacklist.Free;
end;
Run Code Online (Sandbox Code Playgroud)
要使此工作按预期工作,必须为JCL的调试信息启用一种受支持的方法,例如:
我最近在插入EXE的JDBG文件之间切换,只是发送外部JDBG文件,因为它更容易维护.
还有一些对跟踪有用的例程,例如:
function ProcByLevel(Level : Integer) : String;
这允许您确定在调用堆栈"N"级别中回顾的当前方法/过程名称.
从响应和评论到其他答案,听起来你需要一个CALL LOG,而不是CALL STACK.您想要的信息不存在于调用堆栈中.
在这种情况下,我建议您调查一个工具,如SmartInspect或AQ Time.在这两者中,我认为SmartInspect最有可能是相关的.AQ Time更像是一个交互式分析工具,因为SmartInspect具有专门用于远程检查的工具.
从方法返回时,它将从堆栈中删除.所以可能你的部分调用堆栈是每个尚未返回的方法?
例如
DoSomething
begin
MiniSubMethod
DomeSomethingMore
begin
InnerDoSomething
begin
ShowCallStack
end
end
end
Run Code Online (Sandbox Code Playgroud)
我认为在这种情况下调用堆栈会是
InnerDoSomething
DoSomethingMore
DoSomething
Run Code Online (Sandbox Code Playgroud)
MiniSubMethod不再在堆栈中,因为它在调用DoSomethingMore之前返回.
我认为FastMM4包含一个堆栈跟踪,所以你可以试试.
你肯定需要某种日志/堆栈跟踪而不仅仅是调用堆栈.