【问题标题】:Retrieving current stack pointer from /proc/pid/stat从 /proc/pid/stat 检索当前堆栈指针
【发布时间】:2013-02-05 01:25:44
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: c linux operating-system


    【解决方案1】:

    /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("%x\n",<>));'
    7fffffffe338
    

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

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

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

    (gdb) x 0x7fffffffe480
    0x7fffffffe480: 0xffffe578
    

    【讨论】:

    • 感谢您的澄清。将尝试找出为什么在我的测试中内存显示为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多