随时从EurekaLog获取调用堆栈

时间:2015-07-08 23:35:54

标签: delphi delphi-xe2 callstack eurekalog

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

遗留代码中某处的事件导致执行的功能正在执行它不应该执行的操作。虽然我们可以从调试输出中看到函数的名称,但我们无法在没有堆栈跟踪的情况下告诉实际调用它的内容。这不是一个例外,我们不想在该函数中引发异常,因此EurekaLog可以触发。

有没有办法获得调用堆栈而没有任何异常?

2 个答案:

答案 0 :(得分:7)

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

var gems = $("#gems"),
    initialValue = 0;

var valMap = [0, 6500, 14000, 28000, 50000];

var updateSliderValue = function(e, ui) {
    var slider = $(this).data().slider;

    slider.element.find(".ui-slider-handle").text(valMap[ui.value]);
};
console.log(valMap.length);

gems.slider({
    min: 1,
    max: (valMap.length - 1),
    slide: updateSliderValue,
    create: updateSliderValue,
    value: 6500
});

答案 1 :(得分:0)

来自help:使用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;

P.S。您可能还需要考虑使用EurekaLog's logging routines