我正在开发一个非常大的应用程序,我会定期将ENTIRE调用堆栈记录到当前执行点(不是异常)。这里的想法是,我想要一张确切的代码路径的地图,这使我成为我的观点。我一直在使用madExcept,使用jclDebug,虽然我可以获得一些调用堆栈,但我似乎无法获得在应用程序中进行的每个方法/过程/函数调用以显示在日志中。< / p>
我在项目中启用了堆栈帧,调试信息等。我甚至尝试在没有包含在调用堆栈中的各个方法上打开堆栈帧无济于事。
我正在尝试做甚么可能吗?我真的试图避免在数百万行代码中添加日志代码以记录代码路径。
答案 0 :(得分: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;
要使此工作按预期工作,您必须为JCL的调试信息启用一种受支持的方法,例如:
我最近在插入EXE的JDBG文件之间切换到只发送外部JDBG文件,因为它更容易维护。
还有一些对跟踪有用的例程,例如:
function ProcByLevel(Level : Integer) : String;
这允许您确定在调用堆栈“N”级别中回顾的当前方法/过程名称。
答案 1 :(得分:7)
您可以使用madExcept - 它包含名为 GetThreadStackTrace 的方法。 MadExcept可以免费用于非商业用途,绝对物有所值。
答案 2 :(得分:7)
从回复和评论到其他答案,听起来你需要一个CALL LOG,而不是CALL STACK。您想要的信息不会出现在调用堆栈中。
在这种情况下,我建议您调查SmartInspect或AQ Time等工具。在这两者中,我认为SmartInspect最有可能是相关的。 AQ Time更像是一个交互式分析工具,因为SmartInspect具有专门用于远程检测的工具。
答案 3 :(得分:6)
从方法返回时,它将从堆栈中删除。所以可能你的部分调用堆栈是每个尚未返回的方法?
e.g。
DoSomething
begin
MiniSubMethod
DomeSomethingMore
begin
InnerDoSomething
begin
ShowCallStack
end
end
end
我认为在这种情况下调用堆栈将是
InnerDoSomething
DoSomethingMore
DoSomething
MiniSubMethod不再在堆栈中,因为它在调用DoSomethingMore之前返回。
我认为FastMM4包含一个堆栈跟踪,所以你可以试试。
您肯定需要某种日志记录/堆栈跟踪而不仅仅是调用堆栈。
答案 4 :(得分:1)
如果它是您想要的完整曲目,我相信像SmartInspect这样的工具可能会带您走很长的路。
这需要您在代码中添加日志记录,但是对于您需要的内容,这是不可避免的。
实时监控
通过TCP或命名管道向控制台进行高性能实时记录观察和监控资源
跟踪变量值,会话数据和其他应用程序资源。Rich Logging&amp;跟踪强>
跟踪消息,异常,对象,文件,数据库结果和更多。