首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdb回溯机制

gdb回溯机制
EN

Stack Overflow用户
提问于 2019-12-26 19:34:01
回答 2查看 336关注 0票数 0

允许gdb执行backtrace 1的机制得到了很好的解释。

  • 从当前框架开始,查看返回地址
  • ,查找其代码部分包含该地址的函数。

理论上,可能有数十万个函数需要考虑。我想知道是否有任何固有的限制阻止gdb使用return address -> function name创建查找表。

EN

回答 2

Stack Overflow用户

发布于 2019-12-27 14:15:09

是什么让你认为GDB可以直接搜索所有功能呢?事情不是这样的。GDB将符号组织成几个不同的数据结构,以便在地址和封闭函数之间进行更有效的映射。

一个很好的起点可能在这里:https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/blockframe.c;h=d9c28e0a0176a1d91fec1df089fdc4aa382e8672;hb=HEAD#l118

票数 1
EN

Stack Overflow用户

发布于 2019-12-29 19:19:30

--允许gdb执行回溯跟踪1的机制得到了很好的解释。

这根本不是GDB执行backtrace的方式。

存储在rip寄存器中的地址指向当前指令,与返回地址无关。

返回地址存储在堆栈上,或者可能存储在另一个寄存器中。为了找到存储它的位置(在x86_64上,并假设Linux/ELF/DWARF格式),GDB查找包含RIP当前值的展开描述符。展开描述符还告诉GDB如何将其他寄存器恢复到调用当前函数之前的状态。

您可以看到使用例如readelf -wf a.out命令展开描述符。

一旦GDB知道了如何找到返回地址和恢复寄存器,它就可以有效地执行up命令,从当前(被调用的)帧转移到以前的(调用方)帧。

现在,这个过程会重复,直到GDB找到一个特殊的解压描述符,上面写着"I是最后一个,不要试图从我身边松开“,或者发生一些错误(例如,恢复的RIP0)。

值得注意的是,在此过程中,GDB没有任何地方需要考虑数千个函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59492684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档