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



我正在使用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

最新更新