什么是gdb中的“堆栈”部分

问题描述

在gdb中,似乎“堆栈”部分中的内容始终与%rip寄存器相同。例如:

rip 0x0000555555554603
─── Stack ────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x0000555555554603 in main

在完成si之后:

rip 0x0000555555554606
─── Stack ────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x0000555555554606 in main

gdb中的“堆栈”部分到底是什么?在我看来,它似乎是当前正在运行的函数(以及调用堆栈中尚未完成执行的先前%rip)中的指令指针(%rip)。这是正确的,还是本节告诉我们什么?

如果有用,这是我在gdb中使用的前端,称为gdb dashboard

enter image description here

解决方法

那是调用堆栈。 GDB使您可以查看调用堆栈,因此可以了解如何到达目标位置(经历了哪些函数调用才能到达目标位置)。

调用堆栈是已调用但尚未返回的函数的列表,从第0帧处的当前函数开始,一直到最后一帧的main为止。

在您的特定情况下,您的调用堆栈只是主要的,因为您尚未调用其他函数(或因为它们已经返回)。 %rip指向当前指令,因此您在当前框架中的位置始终与其内容相对应。