交叉编译时添加-funwind-tables
,可以通过libgcc库中的接口(interface)(_Unwind_Backtrace和_Unwind_VRS_Get
)成功展开回溯。
但是当我在交叉编译时添加 -O2 选项时,展开回溯将会失败。我通过-Q -O2 --help=optimizers
打印出来优化并测试,但是结果和-O2不一样,很奇怪,
最佳答案
您还没有告诉我们您正在为哪种 ARM 架构构建 - 但假设它是 32 位架构,则启用 -O2
has also enabled -fomit-frame-pointer
(§ -fomit-frame-pointer
)
帧指针
帧指针包含当前函数的堆栈帧的基址(并且知道调用者的帧指针存储在堆栈上,即调用树中所有堆栈帧的链接列表)。它在文档中通常被描述为 fp
- 是 r11
的同义词。
省略帧指针
ARM 寄存器文件很小,有 16 个寄存器 - 其中一个是程序计数器。 帧指针是剩下的 15 个指针之一,仅用于调试和诊断 - 特别是提供堆栈回溯和符号调试。
-fomit-frame-pointer
告诉编译器不要维护帧指针,从而释放 r11
用于其他用途,并可能避免变量溢出到堆栈来自寄存器。它还为堆栈存储的每个堆栈帧以及堆栈的存储和加载节省了 4 个字节。
当然,如果fp
用作通用寄存器,其内容是未定义的并且回溯将不起作用。
为了您自己的理智,您可能需要使用 -fno-omit-frame-pointer
重新启用帧指针。
关于c - 交叉编译时添加-O2选项导致展开回溯失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59486236/