gdb - gdb回溯机制
问题描述
允许gdb
执行的机制得到了backtrace 1
很好的解释。
- 从当前帧开始,查看返回地址
- 查找其代码部分包含该地址的函数。
从理论上讲,可能需要考虑数十万个函数。我想知道是否有任何固有的限制阻止gdb
使用return address -> function name
.
解决方案
允许 gdb 执行回溯 1 的机制已得到很好的解释。
这根本不是GDB执行backtrace
.
寄存器中存放的地址rip
指向当前指令,与返回地址无关。
返回地址存储在堆栈中,或者可能存储在另一个寄存器中。为了找到它的存储位置(在 上x86_64
,并假设例如 Linux/ELF/DWARF 文件格式),GDB 查找覆盖当前值的展开描述符RIP
。unwind 描述符还告诉 GDB 如何将其他寄存器恢复到它们在调用当前函数之前的状态。
您可以使用例如readelf -wf a.out
命令查看展开描述符。
一旦 GDB 知道如何找到返回地址和恢复寄存器,它就可以有效地执行up
命令,从当前(被调用)帧步进到前一个(调用者)帧。
现在重复这个过程,直到 GDB 找到一个特殊的展开描述符,上面写着“我是最后一个,不要试图从我身边展开”,或者出现一些错误(例如,restored RIP
is 0
)。
值得注意的是,在这个过程中, GDB不需要考虑数千个函数。
推荐阅读
- javascript - react navigator react-native-sectioned-multi-select 如何转换成数组项
- python - 使用 Python3 和 SQLlite 存储字典数据
- c# - 显示对象名称,并添加到列表
- json - 在我的 Django 后端接收来自 ReactJS 的 JSON 对象
- firebase - Firebase 基于角色的授权
- python - 如何在 SqlAlchemy 中使用 pandas 进行 upsert
- python - 如何从 pandas DataFrame 列中提取美元金额
- excel - 在 64 位 Excel 中从 VBA 编写注册表
- c# - C# - 如何绘制具有 3 个变量的图表(Position[32]、ByteValue[255]、Frequency[int])
- python - python中的解析错误处理