我正在使用gdb执行一个基本的C程序。我在main()
的开头有一个断点。运行完代码后,gdb按预期在main()处中断。现在,如果我检查堆栈指针寄存器(rsp),我会看到
0x7fffffffe170: 0x00000000.
当我使用cat /proc/17232/stat | cut -d" " -f29/proc
(其中17232是该进程的pid)检索相同的信息时,我看到:
140737488347112 (which in hex is: 0x7fffffffdfe8).
为什么我们看到当前堆栈指针的值与gdb不同。还有,为什么gdb将rsp的内容显示为NULL(0x00000000)?
谢谢。
从/proc
打印rsp寄存器(在64b CPU上)
(gdb) info register rsp
rsp 0x7fffffffe480 0x7fffffffe480
与/proc
的值相比,确实给出了不同的值
me@linux:~$ cat /proc/22219/stat | cut -d" " -f29 | perl -e 'print(sprintf("%xn",<>));'
7fffffffe338
由于gdb必须在main函数开始时强制中断程序才能接管执行,并且将一组最小的数据(返回地址、一些寄存器备份)保存到堆栈上gdb然后,使用自己的堆栈不使程序溢出,并在您请求查看寄存器或处理堆栈数据时进行必要的调整操作,并且不显示内部gdb烹饪。然而,/proc
显示的是真实数据,没有变化。
/proc
中的"真实"rsp实际上略小于gdb,因为在x86 cpu上,堆栈向下增长。
至于null值,在我的测试中没有发生
(gdb) x 0x7fffffffe480
0x7fffffffe480: 0xffffe578