【问题标题】:Logging call stack into file将调用堆栈记录到文件中
【发布时间】:2014-03-04 06:39:22
【问题描述】:

我正在使用 Madexcept 工具记录异常,但我无法定期记录调用堆栈。谁能建议我如何记录调用堆栈。

【问题讨论】:

  • 请提供更多细节。 “定期记录调用堆栈”是什么意思。哪个调用栈?每个线程有一个。定期是什么意思?这样做的目的是什么?
  • 我正在使用一个多线程的应用程序,有时我的应用程序性能很慢,那个时候我想写所有线程的调用堆栈日志来分析问题。我们可以使用任何其他工具来记录调用堆栈吗?
  • 这个问题是一个完整的 madExcept 错误报告需要很长时间才能生成。特别是如果你有很多线程。您需要探查器或侵入性较低的日志记录。

标签: delphi delphi-6 madexcept


【解决方案1】:

要仅获取跟踪而不获取整个报告(这会减慢速度),您可以调用 MadStackTrace。当您想知道您的程序如何进入各种过程/函数/方法时,它非常方便,特别是当它可能以多种方式发生时,或者您正在为性能问题而摸不着头脑。

在你的使用中需要这个:

uses
  MadStackTrace;

// Then to use the thing:

procedure foo;
begin
  writeln('How I got to FOO:' + MadStackTrace.StackTrace);
end;

http://help.madshi.net/madStackTraceUnit.htm

【讨论】:

  • 实际上最昂贵的是堆栈跟踪。而且我认为,所要求的真正是应用程序花费时间的某种痕迹。您在此处所拥有的将生成堆栈跟踪以获取 here
【解决方案2】:

对您的问题的天真回答是,您可以在专用线程中执行以下操作:

var
  exc: IMEException;
....
exc := madExcept.NewException;
Logger.Log(exc.BugReport);

请注意,这会记录整个错误报告。如果您想记录更少的信息,您可以使用常规的 madExcept 技术从 IMEException 参考中提取该信息。

另外请注意,收集所有这些信息需要花费大量时间,并且会干扰程序的执行。在我看来,你真正想要的是一个分析器,或者一些跟踪记录。我不认为 madExcept 实际上是解决您潜在问题的方法。

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 2015-01-13
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2011-04-06
    • 2013-02-01
    • 2014-10-22
    • 2012-11-12
    相关资源
    最近更新 更多