【发布时间】: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 %rcx 和 call func 都更改了堆栈寄存器 rsp,但只有后者实际上更改了 gdb 在“堆栈”部分中显示的内容。
有人能解释一下原因吗?
【问题讨论】:
-
这是一些自定义 gdb 修改,它会打印 call 堆栈,也称为回溯。它只显示嵌套的函数调用。要查看实际堆栈,请执行
x/8x $rsp之类的操作 -
@Jester:是的,但是对于没有调试信息的手写 asm,它如何确定堆栈中的哪些 qwords 来自
call和哪些来自push?我猜它可能会寻找可能的返回地址,即指向文本部分的值?或者,也许 OP 没有向我们展示足够完整的全貌。
标签: assembly stack gdb callstack backtrace