【问题标题】:Library for logging Call Stack at runtime (Windows/Linux)用于在运行时记录调用堆栈的库 (Windows/Linux)
【发布时间】:2011-10-03 06:59:02
【问题描述】:

我需要一种在调试日志中记录函数堆栈跟踪的方法,以帮助我诊断缺陷。问题是我需要使用 C++ 在 Windows 和 Linux 上实现它。

经过一番研究,我发现:

  • 对于 Windows 实现,我可以使用StackWalk64 API 函数和族。
  • 在 Linux 下,我发现 libunwind 听起来不错。
  • 或者,我可以使用 glibc 的backtrace

在开始工作之前,如果这是正确的方法,我想要一些建议,并询问是否有一个已经编写好的多平台库可以提供帮助。我怀疑我不是第一个需要这个的程序员。 :)

【问题讨论】:

  • +1 提出了一个很好的问题!

标签: c++ windows linux debugging


【解决方案1】:

Google Breakpad 会为您处理所有这一切,如果您想从现场获取故障转储。

【讨论】:

  • 崩溃转储包含比我需要的更多信息。并且应该进行后处理 - 这是一个很大的不便。我只需要将堆栈跟踪作为字符串或字符串数​​组。
  • 除非您愿意将私有 PDB 与您的应用一起提供,否则您必须进行后处理,并且 minidump 的大小与大型 JPEG 差不多。
  • 运送私有 PDB 不是问题。
【解决方案2】:

我写了 2 篇关于这个主题的文章,包括 Google 的 breakpad 以及适用于 windows 和 linux 的非常薄的自写方法:

事后调试 - http://drdobbs.com/tools/185300443

重新审视事后调试 - http://drdobbs.com/architecture-and-design/227900186

【讨论】:

    【解决方案3】:

    几年前我写过这个:http://drdobbs.com/cpp/191100567

    基本上,一些宏会记录抛出异常时堆栈展开的位置。

    可以在库 Imebra (http://imebra.com) 中找到该框架的更新版本

    【讨论】:

    • 您指的是 FUNCTION_START/FUNCTION_END 宏?
    • 是的。他们捕获并重新抛出并记录异常的通过。
    猜你喜欢
    • 2010-09-12
    • 2015-05-29
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多