gpt4 book ai didi

GDB + 核心文件转储

转载 作者:行者123 更新时间:2023-12-01 17:23:55 26 4
gpt4 key购买 nike

有人可以帮助我理解这一点吗:-

下面是 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”、“Locals at”和“Previous Frame's sp”这几行是什么意思?请解释一下

最佳答案

此图来自维基百科文章 Call stack可能有帮助:Stack frame layout

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

  • 0xb75f7388:从这里开始的 4 个字节存储旧的 EBP 值,0xb75f73a8base::func() 函数序言插入的第一个值
  • 0xb75f738c:从这里开始的4个字节存储返回地址,0x804869a。由call插入上一帧中的指令
  • 0xb75f7390:从这里开始的 4 个字节存储隐式 this base::func() 的参数,0x00000000

我将解释 info frame逐行输出:

Stack level 0, frame at 0xb75f7390:

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

 eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a

EIP 是 x86 指令指针。 saved eip是返回地址。如果您尝试使用 info symbol 0x804869a 查找包含 0x804869a 的函数,它应该指向调用 base::func() 的函数内部.

 called by frame at 0xb75f73b0

called by显示前一帧的规范帧地址。我们可以看到,两个帧之间堆栈指针前进了 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争论。事实上它是0x0NULL预示着生病了。顺便说一句,ArglistLocals info frame 中似乎总是具有相同的值在 x86 和 x86-64 上。

 Saved registers:
ebp at 0xb75f7388, eip at 0xb75f738c

Saved registers反射(reflect)在函数入口处保存的寄存器。它列出了旧寄存器值在堆栈上的保存位置。保存的 EIP 是返回地址,因此如果您使用 x/a 0xb75f738c 检查存储在 0xb75f738c 的地址。它应该给出0x804869a。此处列出 EBP 的事实意味着您的代码可能不是使用 -fomit-frame-pointer 编译的。并且有一个标准的函数序言:

push %ebp
movl %esp, %ebp

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

关于GDB + 核心文件转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5150481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com