gdb info frame 信息解释

#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 

 可以发现,两个蓝色部分的地址是一样的。

参考:gdb info frame信息解释_xiayu0912的博客-CSDN博客_gdb info

(SAW:Game Over!)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值