允许gdb执行backtrace 1的机制得到了很好的解释。
理论上,可能有数十万个函数需要考虑。我想知道是否有任何固有的限制阻止gdb使用return address -> function name创建查找表。
发布于 2019-12-27 14:15:09
是什么让你认为GDB可以直接搜索所有功能呢?事情不是这样的。GDB将符号组织成几个不同的数据结构,以便在地址和封闭函数之间进行更有效的映射。
发布于 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是最后一个,不要试图从我身边松开“,或者发生一些错误(例如,恢复的RIP是0)。
值得注意的是,在此过程中,GDB没有任何地方需要考虑数千个函数。
https://stackoverflow.com/questions/59492684
复制相似问题