从/ proc/pid/stat中检索当前堆栈指针

Cha*_*ngi 8 c linux operating-system

我正在使用gdb执行一个基本的C程序.我在开始时有一个断点main().运行代码后,gdb按预期在main()处中断.现在,如果我检查堆栈指针寄存器(rsp),我看到了

0x7fffffffe170: 0x00000000. 
Run Code Online (Sandbox Code Playgroud)

当我使用cat /proc/17232/stat | cut -d" " -f29/proc(其中17232是这个过程的pid)检索相同的信息时,我看到:

140737488347112 (which in hex is: 0x7fffffffdfe8). 
Run Code Online (Sandbox Code Playgroud)

为什么我们看到来自gdb的当前堆栈指针的不同值.而且,为什么gdb将rsp的内容显示为NULL(0x00000000)?

谢谢.

Rin*_*g Ø 2

打印rsp寄存器(在 64b cpu 上)/proc

(gdb) info register rsp
rsp            0x7fffffffe480   0x7fffffffe480 
Run Code Online (Sandbox Code Playgroud)

与来自的值相比确实给出了不同的值/proc

me@linux:~$ cat /proc/22219/stat | cut -d" " -f29 | perl -e 'print(sprintf("%x\n",<>));'
7fffffffe338
Run Code Online (Sandbox Code Playgroud)

因为gdb必须在函数开始时强制中断程序以接管执行,并且将最小数据集(返回地址,一些寄存器备份)保存到堆栈中。然后, gdb使用自己的堆栈来避免程序溢出,并在您请求查看寄存器或处理堆栈数据时进行必要的调整操作 - 并且不显示内部gdb烹饪。但显示的是真实数据,没有变化。/proc

实际上, “真实”的rsp/proc小于gdb 的rsp,因为在 x86 cpu 上,堆栈向下增长。

至于值,在我的测试中没有发生

(gdb) x 0x7fffffffe480
0x7fffffffe480: 0xffffe578
Run Code Online (Sandbox Code Playgroud)