gpt4 book ai didi

c - 不使用 ebp 实现堆栈回溯

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:24 25 4
gpt4 key购买 nike

当明确告知编译器不要使用 ebp 作为堆栈帧指针时,如何实现堆栈回溯?

最佳答案

这个问题的答案只出现在对 What is the purpose of the EBP frame pointer register? 上接受的答案的评论中.

现代调试器甚至可以在使用 -fomit-frame-pointer 编译的代码中执行堆栈回溯。该设置是最近的 gcc 中的默认设置。

gcc 将必要的堆栈展开信息放入 .eh_frame_hdr 部分。 See this blog post for more details .它也用于运行时异常。您会在 Linux 系统的大多数二进制文件中找到它(使用 objdump -h)。 /bin/bash 大约是 16k,而 GNU /bin/true 是 572B,ffmpeg 是 108k。

有一个 gcc 选项可以禁止生成它,但它是一个“正常”数据部分,而不是 strip 默认删除的调试部分。否则,您无法通过没有调试符号的库函数进行回溯。该部分可能比它替换的 push/mov/pop 指令更大,但它的运行时成本几乎为零(例如 uop 缓存)。


我认为该部分中存储的信息是从返回地址到堆栈帧大小的映射。由于每个 call 指令都会将后续指令的地址压入堆栈,因此您可以从该地址识别父调用者。不是推送 ebp 以在堆栈 上创建堆栈帧的链表,而是将下一个返回地址的偏移量存储在 .eh_frame_hdr 中部分,因此如果需要回溯的代码可以使用它。

关于c - 不使用 ebp 实现堆栈回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com