为什么除了最后一帧之外,每一帧都没有调用命令

Why isn't a call command at each frame of disassemble except the last

本文关键字:一帧 调用 命令 为什么 最后      更新时间:2023-10-16

我正在通过 gdb 的反汇编输出分析一个核心事后分析。我是新手,所以我对我正在看的东西的理解仍在增长。对我来说,一个直接的困惑是,当我在帧之间移动并查看反汇编输出时,我没有看到 callq 命令作为正在运行的命令,就像我对所有非帧 0 帧所期望的那样。导致第 0 帧的每个帧不应该调用一个函数吗?

(gdb) f 0
(gdb) disassemble
...
=> 0x0000000001b0af10 <+16>:    mov    (%rdi),%rdx
...
End of assembler dump.
(gdb) info registers rdi
rdi            0x0      0

有道理:崩溃是由于空 ptr 取消引用而发生的。现在让我们声名鹊起,看看那里的反汇编输出:

(gdb) up
(gdb) disassemble
...
=> 0x0000000001b1c01b <+315>:   test   %al,%al
...

什么?上面的框架正在运行测试?它不应该调用在第 0 帧中反汇编的函数吗?我误解了什么?

这是从 GCC 4.8 编译C++代码生成的 x64 程序集。

我误解了什么?

x86(和x86_64(,CALL指令将下一条指令的地址推送到堆栈上,并跳转到被调用的函数。

当你去up时,当前指令是你刚刚从返回中升级的帧之后将执行的指令。

如果您想

查看实际CALL,请x/i $pc-5(注意:-5适用于大多数,但不是所有CALL。请参阅下面的彼得·科德斯评论(。