C ++和callstack - 它可以用于获取行号吗?

时间:2014-01-15 20:16:01

标签: c++ gcc c++11 stack-trace stack-unwinding

我无法回想起GCC库使用什么来实现堆栈展开,它用于c ++异常和调用跟踪,我知道C ++规范中没有定义,所以任何答案这是特定于平台的。我正在使用GCC 4.9.0。

了解出错的地方非常有用,尤其是在调试过程中。因此,我经常会在扩展中扩展并传递__LINE____FILE__的宏。

我不是很喜欢这样做,但是它告诉你调用函数的位置(因为宏__LINE____FILE__在调用站点),这真的很方便!

不是使用基于构建条件定义的某些可怕的宏,而是使用堆栈展开库的条件定义代码很好。

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

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

我认为一个后备但不是非常优雅的解决方案是创建一个新的基础,我从中抛出异常并有一个宏重新生成并追加行,文件和__FUNCTION__,但这是一个后备。

我感兴趣的是GCC使用的库和选项,以便GCC控制它输入的信息量,所以请分享你对它的所有知识!

1 个答案:

答案 0 :(得分:0)

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

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

2)在信号处理程序中,只要获得异常,使用系统调用pstack生成跟踪信息。

like :: system(“pstack yourpid> logfilename”);