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

时间:2013-02-20 05:52:30

标签: c linux operating-system

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

(gdb) info register rsp
rsp            0x7fffffffe480   0x7fffffffe480 
与来自/proc

的值相比,

确实给出了不同的值

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

因为 gdb 必须在 main 函数开头的程序中强制interruption才能接管执行,并设置一个最小的集合数据(返回地址,一些寄存器备份)保存到堆栈中。 gdb 然后,使用自己的堆栈不溢出程序,并在请求查看寄存器或处理堆栈数据时进行必要的调整操作 - 并且不显示内部 gdb 烹饪。但是/proc显示实际数据,不变。

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

至于 null 值,在我的测试期间没有发生

(gdb) x 0x7fffffffe480
0x7fffffffe480: 0xffffe578