有些人可以帮助我理解这一点: -
(gdb) info frame
Stack level 0, frame at 0xb75f7390:
eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a
called by frame at 0xb75f73b0
source language c++.
Arglist at 0xb75f7388, args: this=0x0
Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390
Saved registers:
ebp at 0xb75f7388, eip at 0xb75f738c
什么是“ebp,eip Locals at和Previous Frame's sp”是什么意思?请解释
答案 0 :(得分:68)
(gdb)信息框
堆栈级别0
框架位于0xb75f7390
eip = 0x804877f(testing.cpp:16);保存了eip 0x804869a
eip是下一条执行指令的寄存器(也称为程序计数器)。 所以此时,执行的下一个是“0x804877f”,这是testing.cpp的第16行。
保存的eip“0x804869a”被称为“返回地址”,即从该被调用者堆栈返回后在调用者堆栈帧中恢复的指令。它在“CALL”指令时被压入堆栈(保存它以便返回)。
由帧调用,位于0xb75f73b0
源语言c ++
Arglist at 0xb75f7388,args:this = 0x0
当地人在0xb75f7388 ,
局部变量的地址。
上一帧的sp是0xb75f7390
这是前一帧的堆栈指针指向(调用者帧)的位置,在调用时,它也是被调用堆栈帧的起始内存地址。
保存的寄存器 这是被调用堆栈上的两个地址,用于两个已保存的寄存器。
ebp at 0xb75f7388
这是调用者堆栈帧的“ebp”寄存器保存的地址(请注意,它是寄存器,而不是调用者的堆栈地址)。
即,对应于“PUSH%ebp”。 “ebp”是通常被认为是该堆栈帧的本地的起始地址的寄存器,它使用“offset”来寻址。
换句话说,局部变量的操作都使用这个“ebp”,所以你会看到类似mov -0x4(%ebp), %eax
等的东西。
点击0xb75f738c 如前所述,但这里是堆栈的地址(包含值“0x804877f”)。
答案 1 :(得分:5)
要了解“ebp,eip Locals at和Previous Frame's sp”的含义,您需要了解x86 calling convention。
一旦你理解frames are laid out的方式,其他所有事情都将是显而易见的。
答案 2 :(得分:0)
我知道这个问题来自……八年前。但是对于将来的用户,我发现了信息here的清晰轮廓。
这是从上述链接中提取的:
info frame
info f
This command prints a verbose description of the selected stack frame, including:
the address of the frame
the address of the next frame down (called by this frame)
the address of the next frame up (caller of this frame)
the language in which the source code corresponding to this frame is written
the address of the frame’s arguments
the address of the frame’s local variables
the program counter saved in it (the address of execution in the caller frame)
which registers were saved in the frame