Assembly 了解';堆栈';进入标签时显示在gdb中
我有以下大会:Assembly 了解';堆栈';进入标签时显示在gdb中,assembly,x86,stack,gdb,Assembly,X86,Stack,Gdb,我有以下大会: _start: mov $strings, %rbx mov $1, %r12d print_loop: mov %rbx, %rdi 这很简单,但以下是它在gdb中为这三行/指令中的每一行显示的内容: mov$字符串,%rbx 0x00000000004000c4 ? mov $0x6000ea,%rbx # memory address of 'strings' ─── Stack ───────
_start:
mov $strings, %rbx
mov $1, %r12d
print_loop:
mov %rbx, %rdi
这很简单,但以下是它在gdb
中为这三行/指令中的每一行显示的内容:
mov$字符串,%rbx
0x00000000004000c4 ? mov $0x6000ea,%rbx # memory address of 'strings'
─── Stack ──────────────────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x00000000004000c4 in _start
mov$1,%r12d
0x00000000004000cb ? mov $0x1,%r12d
─── Stack ───────────────────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x00000000004000cb in _start
0x00000000004000d1 ? mov %rbx,%rdi
─── Stack ───────────────────────────────────────────────────────────────────────────────────────────────────────
[0] from 0x00000000004000d1 in print_loop
[1] from 0x0000000000000001
[2] from 0x00007fffffffe5aa
[3] from 0x0000000000000000
[0] from 0x00000000004000d1 in print_loop
- or -
[0] from 0x00000000004000d1 in _start
这到底是什么意思
这意味着GDB认为您在print_loop
函数内执行,并且认为该函数是从地址0x1
处的某个代码调用的,该地址是从地址0x7fffffe5aa
等处调用的
为什么会出现这样的情况
它是混乱的
堆栈似乎仍应显示一行:
[0] from 0x00000000004000d1 in print_loop
- or -
[0] from 0x00000000004000d1 in _start
对
现在,您的下一个问题可能是“为什么GDB会感到困惑?” 答案有点复杂 在不使用专用帧指针寄存器的平台上,例如
x86_64
,GDB没有通用的方法来展开堆栈,因此需要编译器的帮助。编译器创建“展开表”,GDB将其解释为执行堆栈展开
由于您是在汇编中编写的,并且没有使用.cfi.
指令,因此您的代码没有任何展开描述符
在没有展开描述符的情况下,GDB只能猜测,这里的猜测是错误的
要解决此问题,您可以提供展开描述符,类似以下内容(未测试):
这应该会取消GDB。可以找到各种
.cfi
指令的文档。GDB特例\u启动
时,是否在堆栈内部执行时不尝试展开堆栈?因为它知道堆栈内容将是argc
和argv[]
…是.cfi
是“调用帧”的缩写,或者这些指令通常与什么有关?@samuelbrody1249我相信cfi
代表“调用帧信息”@samuelbrody1249:google快速搜索站点:stackoverflow.com cfi指令
可以找到一堆东西,包括回答这个问题的东西。看看。一般来说,在让其他人花时间回答评论之前,试着用谷歌搜索你的问题,尤其是广泛的问题。