来自rip的gdb backtrace

时间:2019-12-26 19:34:01

标签: gdb backtrace

很好地说明了允许gdb执行backtrace 1的机制。

  • 从当前帧开始,查看返回地址
  • 寻找一个代码段包含该地址的函数。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

  

很好地解释了允许gdb执行回溯1的机制。

这完全不是 GDB如何执行backtrace

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

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

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

一旦GDB知道如何查找返回地址并恢复寄存器,它就可以有效地执行up命令,从当前(被调用)帧过渡到先前(调用者)帧。

现在重复此过程,直到GDB找到一个特殊的展开描述符,该描述符说“我是最后一个,不要试图绕过我”,或者发生某些错误(例如,还原的RIP是{{1 }}。

值得注意的是,在此过程中,无处 GDB必须考虑数千个功能。