尽管进行了优化,我如何以编程方式获得可靠的回溯?

时间:2018-03-13 02:38:03

标签: linux gcc compiler-optimization backtrace

libc的回溯相关功能的documentation表明了以下限制。

  

请注意,某些编译器优化可能会干扰获取   有效的回溯。函数内联导致内联函数   没有堆叠框架;尾调用优化取代了一个堆栈   框架与另一个;帧指针消除将停止回溯   正确解释堆栈内容。

我在使用backtrace在gcc上编译大型程序时,也观察到来自-O3函数调用的错误返回地址。但是,尽管进行了优化,gdb仍然可以打印正确的回溯。

是否有一种编程方式可以在启用优化的情况下获得正确的回溯?

1 个答案:

答案 0 :(得分:0)

backtrace的算法极其原始,因为它依赖于帧指针来恢复堆栈跟踪。因此,除非您使用-fno-omit-frame-pointer构建代码(否则会降低性能),否则它将无法在任何现代平台上使用。

更好的选择是使用libunwind或libbacktrace并使用-funwind-tables进行编译。

相关问题