很好地说明了允许gdb
执行backtrace 1
的机制。
从理论上讲,可能有数十万个功能需要考虑。
我想知道是否存在阻止gdb
的固有限制
通过使用return address -> function name
创建查找表。
答案 0 :(得分:1)
是什么让您认为GDB会直接搜索所有功能?这不是会发生的事情。 GDB将符号组织成几个不同的数据结构,从而可以更有效地在地址和封闭函数之间进行映射。
答案 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必须考虑数千个功能。