GDB&x2B;核心文件转储

GDB&x2B;核心文件转储,gdb,Gdb,请一些人帮助我理解这一点:- 下面是gdb的摘录。程序崩溃后,我在gdb中打开了二进制文件和核心文件,并发出命令info frame: (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++. Argl

请一些人帮助我理解这一点:-

下面是gdb的摘录。程序崩溃后,我在gdb中打开了二进制文件和核心文件,并发出命令
info frame

(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”、“本地点”和“前一帧的sp”是什么意思?请解释要分析核心文件,请执行:

$gdb可执行内核

gdb$bt——回溯

或gdb$fr 0——运行时堆栈中最上面的帧 gdb$fr 1等将给出导致Seg故障的函数调用顺序


在这里,gdb$info frame为您提供了关于frame 0的信息。

维基百科文章中的这个图表可能会有帮助:

GDB的
info帧
对应于在运行时在程序中调用的函数。从输出中,我们可以推断出堆栈框架布局:

  • 0xb75f7388:从这里开始的4个字节存储旧的EBP值,0xb75f7388
    base::func()的函数序言推送的第一个值
  • 0xb75f738c:从这里开始的4个字节存储返回地址,0x804869a。由上一帧中的
    call
    指令推动
  • 0xb75f7390:从这里开始的4个字节将隐式
    参数存储到
    base::func()
    0x00000000
我将逐行解释
信息框
输出:

Stack level 0, frame at 0xb75f7390:
堆栈级别0表示这是最新的帧。位于
帧之后的地址称为规范帧地址(CFA)。在x86上,这被定义为执行调用指令之前上一帧的堆栈指针(ESP)的值

 eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a
EIP是x86指令指针<代码>保存的eip
是返回地址。 如果您试图使用
信息符号0x804869a
查找包含0x804869a的函数,它应该指向调用
base::func()的函数内部

调用的
显示前一帧的规范帧地址。我们可以看到堆栈指针在两个帧之间前进了32个字节(0xb75f73b0-0xb75f7390=32)

 source language c++.

 Arglist at 0xb75f7388, args: this=0x0
 Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390
x86 ABI在堆栈上传递参数
base::func()
只有一个隐式
this
参数。它是
0x0
的事实,即
NULL
预示着不好。另一方面,在x86和x86-64上,
Arglist
Locals
似乎在
info frame
中始终具有相同的值

 Saved registers:
  ebp at 0xb75f7388, eip at 0xb75f738c
保存的寄存器
反映在函数输入时保存的寄存器。它列出旧寄存器值保存在堆栈上的位置。保存的EIP是返回地址,因此,如果使用
x/a 0xb75f738c检查存储在0xb75f738c的地址,则应给出0x804869a。此处列出的EBP表明您的代码可能不是使用
-fomit frame pointer
编译的,并且具有标准函数序言:

push %ebp
movl %esp, %ebp

base::func()
的请求下,设置EBP作为帧指针。

的精确副本的可能副本。你为什么老是问同一个问题?他可能想得到一个更具描述性的答案,可能不想把精力放在阅读所有维基百科链接上。
push %ebp
movl %esp, %ebp