#include <stdio.h>
void show3()
{
puts("show3");
}
void show2()
{
puts("show2");
show3();
}
void show1()
{
puts("show1");
show2();
}
int main()
{
show1();
return 0;
}
执行如下指令:
$gcc -o test.o test.cc -g
$gdb test.o -q
(gdb) b 4
(gdb) r
Starting program: /home/xcl/Doc/test/test.o
show1
show2
Breakpoint 1, show3 () at test.cc:5
5 puts("show3");
(gdb) backtrace
#0 show3 () at test.cc:5
#1 0x0000555555554662 in show2 () at test.cc:11
#2 0x000055555555467a in show1 () at test.cc:17
#3 0x0000555555554686 in main () at test.cc:22
(gdb) info frame
Stack level 0, frame at 0x7fffffffdac0:
rip = 0x55555555463e in show3 (test.cc:5); saved rip = 0x555555554662
called by frame at 0x7fffffffdad0
source language c++.
Arglist at 0x7fffffffdab0, args:
Locals at 0x7fffffffdab0, Previous frame's sp is 0x7fffffffdac0
Saved registers:
rbp at 0x7fffffffdab0, rip at 0x7fffffffdab8
进入正题!
Stack level 0, frame at 0x7fffffffdac0:
含义:当前栈的起始地址 0x7fffffffdac0 。
rip = 0x55555555463e in show3 (test.cc:5); saved rip = 0x555555554662
含义:
- 0x55555555463e 表示当前的 rip 寄存器的值(test.cc:5)。
- 0x555555554662:表示调用本函数(当前调用函数为 show3)的指令的地址,即:0x555555554662 应该表示的是源程序第 11 行翻译成汇编后的地址。
called by frame at 0x7fffffffdad0
含义:这个表示上一个栈帧的地址,因为当前函数是 show3,所以这个地址表示 show2 的栈的地址,可以用命令查看一下 show2 的栈地址。
source language c++.
含义:源程序是 c++ 语言。
Arglist at 0x7fffffffdab0, args:
含义:存放函数参数的地址从 0x7fffffffdab0 开始。
Locals at 0x7fffffffdab0, Previous frame's sp is 0x7fffffffdac0
含义:存放函数局部变量的地址从 0x7fffffffdab0 开始。
Saved registers:
rbp at 0x7fffffffdab0, rip at 0x7fffffffdab8
含义:调用函数的过程中,压栈时保存的相关寄存器的值。
其他
查看上一个栈帧的信息。
(gdb) backtrace
#0 show3 () at test.cc:5
#1 0x0000555555554662 in show2 () at test.cc:11
#2 0x000055555555467a in show1 () at test.cc:17
#3 0x0000555555554686 in main () at test.cc:22
(gdb) select-frame 1
(gdb) info frame
Stack level 1, frame at 0x7fffffffdad0:
rip = 0x555555554662 in show2 (test.cc:11); saved rip = 0x55555555467a
called by frame at 0x7fffffffdae0, caller of frame at 0x7fffffffdac0
source language c++.
Arglist at 0x7fffffffdac0, args:
Locals at 0x7fffffffdac0, Previous frame's sp is 0x7fffffffdad0
Saved registers:
rbp at 0x7fffffffdac0, rip at 0x7fffffffdac8
可以发现,两个蓝色部分的地址是一样的。
(SAW:Game Over!)