异常堆栈跟踪

4

如何最佳实现异常堆栈跟踪?

我发现使用uncaught_exception()可以解决问题,但需要在每个函数中添加一些代码。

我需要在Linux和Windows下的gcc中运行。


你想看到什么样的输出? - anon
重复:https://dev59.com/yHVD5IYBdhLWcg3wI36L - Daniel Earwicker
这不是同一个问题。当我的应用程序崩溃时,我不想要一个堆栈跟踪,我想要一个类似于Java中的e.printStackTrace();附加到我的异常上的堆栈跟踪。 - f4.
4
你的方向错了,不要试图在C++中复制Java异常。这两种语言是不同的。不过你可以看看boost::exception库。 - Nikolai Fetissov
2
实际上我只了解很少的Java,并不打算模仿它,我只是发现能够打印异常来源和经过的路径非常有用... 用于调试目的。 - f4.
3个回答

4

我认为没有跨平台的方法可以做到这一点。在Windows上,请查看StackWalk方法;在Linux上,请参考man backtrace。这将获取信息;格式化信息需要由您完成。


4
我不确定是否存在一种可靠的跨平台方法来展开堆栈。
我所使用的所有平台/架构都提供了一种在异常发生时遍历堆栈并将地址与函数名匹配的方法。这些方法都不具备可移植性,但报告框架可以编写为可移植的,实际的堆栈遍历代码保持特定于平台(在Windows上是StackWalk,在Linux上是backtrace)。
你可以看看libunwind项目。我自己从未使用过或研究过它,因此可能不是你要找的东西。

2
我编写了一些代码,用于将当前的堆栈跟踪输出为字符串;如果您感兴趣,请查看此文件中从第1220行开始的GetStackTrace()函数。该函数在Linux、MacOS/X和Windows下均可工作(请注意,我从这里借用了Windows实现,并且在Windows下实现此功能需要大量的代码……呕)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接