【问题标题】:Exceptions stacktrace异常堆栈跟踪
【发布时间】:2011-01-05 02:06:35
【问题描述】:

实现异常堆栈跟踪的最佳方式是什么?

我找到了某种使用 uncaught_exception() 的解决方案,但它需要向每个函数添加一些代码。

我需要一些在 linux 和 windows 下的 gcc 工作

【问题讨论】:

  • 你想看到什么样的输出?
  • 这不是同一个问题。当我的应用程序崩溃时,我不想要堆栈跟踪,我想要附加到我的异常的堆栈跟踪,就像 e.printStackTrace();在Java中
  • 再一次,你会走错方向。不要试图在 C++ 中复制 Java 异常。语言不同。看看 boost::exception 库。
  • 实际上我对 Java 知之甚少,并不打算模仿它,我只是发现能够打印异常的来源以及它经历了什么……用于调试目的跨度>

标签: c++


【解决方案1】:

我认为没有跨平台的方法可以做到这一点。在 windows 上,查看 StackWalk 方法;在 linux 上,人回溯。这将获取信息;由你来格式化。

【讨论】:

    【解决方案2】:

    我不确定是否存在可靠的跨平台展开堆栈的方法。

    我从事的所有平台/架构都提供了一种在发生异常时遍历堆栈并将地址与函数名称匹配的方法。这些都不是可移植的,但报告框架可以编写成可移植的,实际堆栈遍历代码保持特定于平台(Windows 上的 StackWalk 或 Linux 上的回溯)。

    您可以查看libunwind 项目。我自己从来没有使用过或研究过这个,所以它可能不是你想要的。

    【讨论】:

      【解决方案3】:

      我实现了一些将当前堆栈跟踪生成为字符串的代码;如果您有兴趣,请查看从this file 的第 1220 行开始的 GetStackTrace() 函数。该功能可在 Linux、MacOS/X 和 Windows 下运行(请注意,我从 here 借用了 Windows 实现,并且在 Windows 下实现此功能需要大量的代码......哎呀)

      【讨论】:

        猜你喜欢
        • 2017-08-06
        • 2010-09-13
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多