可以帮我理解一下吗:-

(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的sp”是什么意思?请解释

最佳答案

(GDB)信息框

堆栈级别0

backtrace中的

  • 框架编号,0是当前正在执行的框架,向下增长,与堆栈一致。

  • 帧位于0xb75f7390
  • 该堆栈帧的起始存储地址

  • eip = 0x804877f在base::func()中(testing.cpp:16);保存的eip 0x804869a
  • eip是下一条要执行的指令的寄存器(也称为程序计数器)。
    因此,此刻要执行的下一个操作是在“0x804877f”处,即test.cpp的第16行。
  • 保存的eip“0x804869a”称为“返回地址”,即从该被调用者堆栈返回后在调用者堆栈帧中恢复的指令。根据“CALL”指令将其压入堆栈(保存以供返回)。

  • 由帧在0xb75f73b0处调用
  • 调用者堆栈框架的地址

  • 源语言c++
  • 使用哪种语言

  • Arglist位于0xb75f7388,参数:此= 0x0
  • 参数
  • 的起始地址

    当地人,位于0xb75f7388

    局部变量的地址。

    上一帧的sp为0xb75f7390

    这是前一帧的堆栈指针指向(调用者帧)的位置,在调用时,它也是被调用堆栈帧的起始内存地址。

    保存的寄存器:
    这是被调用者堆栈上的两个地址,用于保存两个寄存器。
  • ebp位于0xb75f7388
    那是保存调用者堆栈帧的“ebp”寄存器的地址(请注意,它是寄存器,而不是调用者堆栈地址)。
    即对应于“PUSH%ebp”。 “ebp”是通常被视为该堆栈帧本地地址的起始地址的寄存器,使用“偏移量”进行寻址。
    换句话说,局部变量的操作都使用此“ebp”,因此您将看到类似于mov -0x4(%ebp), %eax等的信息。
  • eip地址为0xb75f738c
    如前所述,但这是堆栈的地址(其中包含值“0x804877f”)。
  • 关于gdb - 如何解释GDB “info frame”输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5144727/

    10-11 23:06