1

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

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

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

4

2 回答 2

7

您无需引发异常即可获取堆栈跟踪。调用 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;
于 2015-07-08T23:45:43.347 回答
1

来自帮助:使用单元GetCurrentCallStack中的功能ECallStack

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;

PS 你可能还想考虑使用EurekaLog 的日志记录例程

于 2019-06-11T11:21:20.317 回答