GCC如何打印堆栈跟踪?

时间:2020-05-07 18:40:24

标签: c++ gcc

当gcc / g ++遇到ICE(内部编译器错误)时,最新版本的编译器将在退出之前打印出整齐的堆栈跟踪。

问题:采用什么技术来实现? GCC是用C ++编写的,因此有些保守的修订版本,例如C ++ 03。

尤其是

  • GCC不使用Boost。

  • 据我所知,GCC不会使用linunwind或liblib之类的外部库。

  • GCC不一定使用glibc。例如,我可以在Linux上为主机mingw32交叉编译GCC,而堆栈跟踪也可以正常工作。


因此,在盲目关闭此问题之前,请确保链接的答案不需要这些库中的任何一个。

1 个答案:

答案 0 :(得分:1)

正如评论中提到的许多人所述,GCC静态链接到libbacktrace,该链接在ELF平台(例如Linux)上使用libgcc,在AIX和Windows上使用自定义代码。假设大多数人会对Linux感兴趣,那么我将在下面的内容中进行扩展。

GCC运行时库(libgcc)包含用于C ++异常和错误报告的堆栈展开代码。特别是,它由Glibc(backtrace(3)),AddressSanitizer和GCC本身使用。

展开的内部实现高度依赖于目标。例如,在amd64上,它使用存储在.eh_frame节中的堆栈布局元数据(请参阅https://uclibc.org/docs/psABI-x86_64.pdf);在ARM上,它也使用元数据(但格式不同);在i386上,它手动解析函数序言指令(有关特定平台的详细信息,可以研究https://github.com/gcc-mirror/gcc/tree/master/libgcc中的相关展开文件。