libc的回溯相关功能的documentation表明了以下限制。
请注意,某些编译器优化可能会干扰获取 有效的回溯。函数内联导致内联函数 没有堆叠框架;尾调用优化取代了一个堆栈 框架与另一个;帧指针消除将停止回溯 正确解释堆栈内容。
我在使用backtrace
在gcc上编译大型程序时,也观察到来自-O3
函数调用的错误返回地址。但是,尽管进行了优化,gdb
仍然可以打印正确的回溯。
是否有一种编程方式可以在启用优化的情况下获得正确的回溯?
答案 0 :(得分:0)
backtrace
的算法极其原始,因为它依赖于帧指针来恢复堆栈跟踪。因此,除非您使用-fno-omit-frame-pointer
构建代码(否则会降低性能),否则它将无法在任何现代平台上使用。
更好的选择是使用libunwind或libbacktrace并使用-funwind-tables
进行编译。