【问题标题】:Get the call stack from EurekaLog at any time随时从EurekaLog获取调用栈
【发布时间】:2015-07-08 23:35:54
【问题描述】:

在 SO 上有很多关于获取调用堆栈以进行异常处理的帖子,我们有 EurekaLog 来处理它,但我真的希望能够在运行时的任何时候获取堆栈,就像你放IDE 中的断点。

遗留代码中某处的事件导致函数执行,该函数正在执行不应该执行的操作。虽然我们可以从调试输出中看到函数的名称,但如果没有堆栈跟踪,我们无法判断实际调用它的内容。这不是异常,我们不想在该函数中引发异常以便 EurekaLog 可以触发。

有没有办法毫无例外地获取调用堆栈?

【问题讨论】:

  • 您查看文档了吗?

标签: delphi delphi-xe2 callstack eurekalog


【解决方案1】:

您无需引发异常即可获取堆栈跟踪。调用EurekaLog的GetTracer()函数得到一个TEurekaBaseStackList对象,然后调用它的Build()方法得到堆栈跟踪。以下是 EurekaLog 文档中提供的示例:

var
  CallStack: TEurekaBaseStackList;
begin
  CallStack := GetTracer(TracerWindows);
  try
    // Build current call stack including current execution point
    CallStack.Build(CallStack.GetCurrentInstruction);
    // ... use CallStack somehow
  finally
    FreeAndNil(CallStack);
  end;
end;

【讨论】:

    【解决方案2】:

    来自help:使用来自ECallStack单位的GetCurrentCallStack函数:

    uses
      ECallStack; // for TEurekaBaseStackList and GetCurrentCallStack
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      CallStack: TEurekaBaseStackList;
    begin
      CallStack := GetCurrentCallStack;
      // You can also use other functions from ECallStack unit
      try
        Memo1.Lines.Assign(CallStack);
        // You can also use: 
        // CallStack.ToString - to convert call stack to String
        // CallStackToString(s) routines to customize textual formatting
      finally
        FreeAndNil(CallStack);
      end;
    end;
    

    附:您可能还想考虑使用EurekaLog's logging routines

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2011-01-19
      • 2011-11-12
      • 2015-11-18
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多