很好地说明了允许gdb
执行backtrace 1
的机制。
理论上,可能要考虑成千上万的功能。我想知道是否存在阻止gdb
的固有限制通过使用return address -> function name
创建查找表。
是什么使您认为GDB会直接搜索所有功能?这不是发生了什么。 GDB将符号组织成几个不同的数据结构,从而可以更有效地映射地址和封闭函数。
很好解释了允许gdb执行回溯1的机制。
这不是完全不是>> GDB如何执行backtrace
。
存储在rip
寄存器中的地址指向当前
where
(在x86_64
上,并假设使用Linux / ELF / DWARF文件格式),GDB查找覆盖RIP
当前值的展开描述符。展开描述符还告诉GDB如何将其他寄存器恢复到刚调用当前函数之前的状态。您可以使用例如readelf -wf a.out
命令。[一旦GDB知道如何查找返回地址并还原寄存器,它就可以有效地执行up
命令,从当前(被调用)帧到前一个(调用者)帧。
现在重复此过程,直到GDB找到一个特殊的展开描述符,上面写着“我是最后一个,不要试图绕过我”,否则会发生一些错误(例如,还原的RIP
为0
)。] >
[值得注意的是,
nowhere
在此过程中,GDB必须考虑数千个功能。