fir*_*ush 2 c++ callstack gdb x86-64 disassembly
我正在通过反汇编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
Run Code Online (Sandbox Code Playgroud)
很有道理:崩溃是由于ptr取消引用无效而发生的。现在,让我们一举成名,然后在此处查看反汇编输出:
(gdb) up
(gdb) disassemble
...
=> 0x0000000001b1c01b <+315>: test %al,%al
...
Run Code Online (Sandbox Code Playgroud)
什么?上面的框架正在运行测试?它不应该调用在第0帧中反汇编的函数吗?我有什么误会?
这是从GCC 4.8编译C ++代码生成的x64程序集。
我有什么误会?
在x86(和x86_64)上,CALL指令将下一条指令的地址压入堆栈,然后跳转到被调用的函数。
当您转到时up,当前指令是您刚从上一步返回的帧之后执行的指令。
这样做x/i $pc-5,如果你想看到实际的CALL(:说明-5适用于大多数,但不是所有的CALLS下方见彼得·科德斯评论。)。