如何解释GDB"信息框架"输出?

Dew*_*Dew 43 gdb

有人可以帮我理解这个: -

(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
Run Code Online (Sandbox Code Playgroud)

什么是"ebp,eip Locals at和Previous Frame's sp"是什么意思?请解释

pep*_*ero 76

(gdb)信息框架

堆栈级别0

  • backtrace中的帧数,0是当前正在执行的帧,它与堆栈一致向下增长.

帧位于0xb75f7390

  • 启动此堆栈帧的内存地址

base :: func()中的eip = 0x804877f(testing.cpp:16); 保存了eip 0x804869a

  • eip是下一条执行指令的寄存器(也称为程序计数器).所以此时,执行的下一个是"0x804877f",这是testing.cpp的第16行.

  • 保存的eip"0x804869a"被称为"返回地址",即从该被调用者堆栈返回后在调用者堆栈帧中恢复的指令.它在"CALL"指令时被压入堆栈(保存它以便返回).

帧由0xb75f73b0调用

  • 调用者堆栈帧的地址

源语言c ++

  • 使用哪种语言

Arglist在0xb75f7388,args:this = 0x0

  • 参数的起始地址

当地人在0xb75f7388,

局部变量的地址.

前一帧的sp是0xb75f7390

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

保存的寄存器: 这是被调用堆栈上的两个地址,用于两个保存的寄存器.

  • ebp在0xb75f7388,即保存调用者堆栈帧的"ebp"寄存器的地址(请注意,它是寄存器,而不是调用者的堆栈地址).即,对应于"PUSH%ebp"."ebp"是通常被认为是该堆栈帧的本地的起始地址的寄存器,它使用"offset"来寻址.换句话说,局部变量的操作都使用这个"ebp",所以你会看到类似的东西等mov -0x4(%ebp), %eax.

  • 如前所述,在0xb75f738c处跳过,但这里是堆栈的地址(包含值"0x804877f").

  • 很好的答案,但是我想为最后一点指出一个不同的答案."saved eip 0x804869a"显示已保存指令指针的VALUE,即在程序中确切返回的位置.但是,此值将保存到特定地址的堆栈中.要找到保存eip的堆栈上的ADDRESS,请查看"已保存寄存器"下的最后两行,其中显示"eip at 0xb75f738c".换句话说,"保存的eip"的地址是0xb75f738c,包含值0x804869a而不是值0x804877f.值0x804877f存储在寄存器eip中. (7认同)
  • 同样,前面的ebp也保存在堆栈上,堆栈地址为0xb75f7388。根据我的理解,寄存器ebp的值指向保存前一个ebp的堆栈地址。然后它用作各种计算的参考点,例如ebp+4、ebp+8。 (2认同)

Emp*_*ian 4

要了解"ebp,eip Locals at和Previous Frame的sp"是什么意思,你需要了解x86调用约定.

一旦你理解了框架的布局,所有其他的东西都将是显而易见的.