首页 > 解决方案 > gdb回溯机制

问题描述

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

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

标签: gdbbacktrace

解决方案


允许 gdb 执行回溯 1 的机制已得到很好的解释。

这根本不是GDB执行backtrace.

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

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

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

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

现在重复这个过程,直到 GDB 找到一个特殊的展开描述符,上面写着“我是最后一个,不要试图从我身边展开”,或者出现一些错误(例如,restored RIPis 0)。

值得注意的是,在这个过程中, GDB不需要考虑数千个函数。


推荐阅读