3

我不太记得 GCC 使用什么库来实现堆栈展开,它用于 C++ 异常和调用跟踪,而且我知道 C++ 规范中没有定义任何方法,所以对此的任何答案都是特定于平台的。我正在使用 GCC 4.9.0。

知道哪里出了问题非常有用,尤其是在调试期间。所以很多时候我会有一些宏来扩展和传递一些东西__LINE__,并__FILE__在扩展中。

我不太喜欢这样做,但它会告诉你从哪里调用函数(作为宏__LINE__并且__FILE__在调用站点),这真的很方便!

与其使用一些基于构建有条件地定义的可怕宏,不如拥有一些使用堆栈展开库的有条件定义的代码。

使用什么库?编译时可以告诉编译器要记录多少信息?显然,对于发布版本,您只需要异常处理所需的内容。

如果不是,约定是什么?C++ 程序员如何获得 Python 和 Java 程序员认为理所当然的东西——冗长的堆栈跟踪。

我想一个后备但不是很优雅的解决方案是创建一个新的基础,我从中抛出异常并有一个宏来重新抛出和附加行、文件和__FUNCTION__,但这是一个后备。

我对 GCC 使用的库以及提供给 GCC 以控制其放入多少信息的选项感兴趣,因此请分享您对此的任何知识!

4

1 回答 1

0

如果您在 linux 下使用,这是另一种选择。

1)设计您的信号处理程序,因此任何异常都将由您自己的信号处理程序处理,而不是像生成核心转储文件那样的系统。

2)在您的信号处理程序中,只要遇到异常,就使用系统调用 pstack 生成跟踪信息。

像 ::system ("pstack yourpid >logfilename");

于 2014-01-16T07:55:22.557 回答