【发布时间】:2016-11-04 14:37:18
【问题描述】:
使用gdb调试汇编程序时,bt会打印调用堆栈。
问题是:
-
(a) gdb 是否根据
rbp存储在当前函数寄存器中的值以及以前 rbp 值在堆栈中的值知道这一点? - 如果是,(b-1) gdb 如何根据
rbp值知道它是哪个函数? (b-2) 当编译时指定-g选项时,堆栈基数和函数之间的映射是否存储在可执行文件中? (b-3) 以及如何使用readelf读取映射数据?哪一部分? - 如果不是,(c) 那么gdb如何跟踪函数调用栈呢?
【问题讨论】:
-
rbp值是堆栈地址,并且没有与功能代码地址/名称的 1:1 映射。您必须为此查看退货地址。罗斯的回答解释了如何在回溯时找到堆栈上的返回地址。 -
@PeterCordes 我猜是
rip值有助于在rbp的帮助下跟踪函数调用堆栈。是的,罗斯的回答很棒,我认为当可执行文件不遵循 rbp/rsp 约定时,实际上使用了unwindinfo。 -
是的,回溯需要找到的是保存的返回地址(
RIP值)。你是对的,在老式的push rbpstack-frame-making 约定中,保存的rbp值形成一个链表,返回地址位于每个帧内的已知位置。 (顺便说一句,这不仅仅是一个隐喻;它实际上是一个链表。RIP值只是每个节点中的数据,而不是它们自己的链表。只有rbp值指向下一个节点。) ,我应该说EIP/EBP的值,因为我认为.eh_frame的数据默认用于64位。
标签: assembly gdb stack-trace backtrace