libc的回溯相关功能的文档声明了以下限制。
注意,某些编译器优化可能会干扰获得有效的回溯跟踪。函数内联导致内联函数没有堆栈帧;尾调用优化将一个堆栈帧替换为另一个堆栈帧;帧指针消除将阻止反向跟踪正确解释堆栈内容。
我还注意到,在用backtrace编译gcc上的大型程序时,-O3函数调用产生的返回地址不正确。然而,尽管进行了优化,gdb似乎仍然能够打印正确的回溯跟踪。
是否有一种编程方法可以在打开优化时获得正确的回溯?
发布于 2019-01-27 07:19:46
backtrace的算法非常原始,因为它依赖于帧指针来恢复堆栈跟踪。因此,除非您用-fno-omit-frame-pointer构建代码(这会损害性能),否则它不会在任何现代平台上工作。
一个更好的选择是使用libunwind或libbacktrace跟踪并使用-funwind-tables进行编译。
https://stackoverflow.com/questions/49247458
复制相似问题