【问题标题】:When does gdb show something 'on the stack'?gdb 何时显示“堆栈上”的内容?
【发布时间】:2020-12-18 11:39:26
【问题描述】:

使用以下程序集:

mov $2, %rax
push %rcx
call func

gdb 中的“堆栈”部分如下所示:

─── Stack ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x0000000000400109 in func
[1] from 0x00000000004000be in _start

添加或删除push %rcx 指令并不重要。为什么 gdb 只显示“函数地址堆栈”,而在手动推送时不显示对堆栈的任何修改?也就是说,push %rcxcall func 都更改了堆栈寄存器 rsp,但只有后者实际上更改了 gdb 在“堆栈”部分中显示的内容。

有人能解释一下原因吗?

【问题讨论】:

  • 这是一些自定义 gdb 修改,它会打印 call 堆栈,也称为回溯。它只显示嵌套的函数调用。要查看实际堆栈,请执行 x/8x $rsp 之类的操作
  • @Jester:是的,但是对于没有调试信息的手写 asm,它如何确定堆栈中的哪些 qwords 来自 call 和哪些来自 push?我猜它可能会寻找可能的返回地址,即指向文本部分的值?或者,也许 OP 没有向我们展示足够完整的全貌。

标签: assembly stack gdb callstack backtrace


【解决方案1】:

gdb 中的“堆栈”部分如下所示:

这里的“堆栈”代表“调用堆栈”,而不是“堆栈内存”。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2016-11-04
    • 2013-01-27
    • 2015-03-03
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多