【发布时间】:2019-08-01 10:42:21
【问题描述】:
问题是关于在优化的二进制文件中以编程方式打印有意义的堆栈跟踪。
例如
我们可以使用backtrace、backtrace_symbols、abi::__cxa_demangle 来打印堆栈跟踪。
但据我所知,我们需要使用编译器标志-g 构建二进制文件,而不是高于-O1 优化标志。我可以做到这一点。
我期待在发布二进制文件中生成具有正确函数名称的回溯,例如使用-O3 标志编译。
可行吗? 我对此做了很多研究,但没有得到任何实质性的东西。
更新 1: 有没有一种方法可以让我们拥有一个包含一些符号的辅助文件,并且可以参考该文件以从优化的二进制进程中生成堆栈跟踪?
【问题讨论】:
-
只是翻拍。我认为使用
-O3编译可以省略帧指针,从而更难获得堆栈跟踪。 gcc 有一个标志。例如,-O3 -fno-omit-frame-pointer -
@BiagioFesta 谢谢让我试试,对性能有影响吗?
-
当然,它不是完全免费的。从技术上讲,省略帧指针使编译器有机会保存一个寄存器。 “-fomit-frame-pointer 选项指示编译器在函数不需要时不存储堆栈帧指针。您可以使用此选项来减小代码图像大小。”
-
激进的优化可以做函数内联,这使得调用堆栈的一部分似乎丢失了。
-
你想要达到的目标不兼容。想象一下基本上 any 模板代码,如<algorithm> header 的核心。有这么多函数只是为了调用另一个函数。最后,语句的操作可以非常简单,但很可能会扩展到 10 项的深度回溯。这就是
-O3通过积极内联所防止的。如果要保留调用链的每个环节,请使用-O2或-Og。
标签: c++ c stack-trace backtrace signal-handling