需要一种方法来定期记录调用的所有方法/过程/函数的调用堆栈/堆栈跟踪

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的调试信息启用一种受支持的方法,例如:

  • Turbo调试器信息
  • JDBG文件(从MAP文件生成)
  • JBDG文件插入EXE.

我最近在插入EXE的JDBG文件之间切换,只是发送外部JDBG文件,因为它更容易维护.

还有一些对跟踪有用的例程,例如:

function ProcByLevel(Level : Integer) : String;

这允许您确定在调用堆栈"N"级别中回顾的当前方法/过程名称.


Uwe*_*abe 7

您可以使用madExcept - 它包含一个名为GetThreadStackTrace的方法.MadExcept可以免费用于非商业用途,绝对物有所值.


Del*_*ics 7

从响应和评论到其他答案,听起来你需要一个CALL LOG,而不是CALL STACK.您想要的信息不存在于调用堆栈中.

在这种情况下,我建议您调查一个工具,如SmartInspectAQ Time.在这两者中,我认为SmartInspect最有可能是相关的.AQ Time更像是一个交互式分析工具,因为SmartInspect具有专门用于远程检查的工具.


Jam*_*ass 6

从方法返回时,它将从堆栈中删除.所以可能你的部分调用堆栈是每个尚未返回的方法?

例如

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包含一个堆栈跟踪,所以你可以试试.

你肯定需要某种日志/堆栈跟踪而不仅仅是调用堆栈.