如何解决了解进入标签时gdb中显示的“堆栈”
我有以下程序集:
_start:
mov $strings,%rbx
mov $1,%r12d
print_loop:
mov %rbx,%rdi
这很简单,但这是这三行/每条指令在gdb
中显示的内容:
-
mov $strings,%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
的某些代码调用的,而该代码是从地址0x7fffffffe5aa
调用的,等
为什么会显示这样的内容?
很困惑。
似乎堆栈仍应显示一行:
正确。
现在,您的下一个问题可能是“为什么GDB会感到困惑?”。
答案有些复杂。
在不使用专用帧指针寄存器的平台上,例如x86_64
,GDB没有 general 的方式来展开堆栈,并且需要编译器的帮助来这样做。编译器创建“展开表”,GDB将其解释为执行堆栈展开。
由于您是用汇编语言编写的,并且没有使用.cfi_...
指令,因此您的代码没有任何展开描述符。
在没有展开描述符的情况下,GDB只能猜测,并且此处猜测不正确。
要解决此问题,您可以提供展开描述符,如下所示(未经测试):
_start:
.cfi_startproc
.cfi_undefined(rip) # no unwinding past this function
mov $strings,%rbx
mov $1,%r12d
print_loop:
mov %rbx,%rdi
...
.cfi_endproc
,这应该使GDB更加混乱。各种.cfi
指令的文档可以在here中找到。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。