gdb追溯机制

问题描述 投票:0回答:2

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

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

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

gdb backtrace
2个回答
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
投票

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

这不是完全不是>> GDB如何执行backtrace

存储在rip寄存器中的地址指向当前

指令,并且与返回地址没有任何关系。返回地址存储在堆栈中,或者可能存储在另一个寄存器中。为了找到

where

(在x86_64上,并假设使用Linux / ELF / DWARF文件格式),GDB查找覆盖RIP当前值的展开描述符。展开描述符还告诉GDB如何将其他寄存器恢复到刚调用当前函数之前的状态。您可以使用例如readelf -wf a.out命令。

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

现在重复此过程,直到GDB找到一个特殊的展开描述符,上面写着“我是最后一个,不要试图绕过我”,否则会发生一些错误(例如,还原的RIP0)。] >

[值得注意的是,

nowhere

在此过程中,GDB必须考虑数千个功能。
© www.soinside.com 2019 - 2024. All rights reserved.