在X86_64 Linux中uc_mcontext-> fpregs和ucontext-> __ fpregs_mem中不同的寄存器数据

问题描述 投票:1回答:1

我正在尝试在SIGFPE处理程序中读取FPU上下文。使用GDB,我在SIGFPE处理程序中设置了一个断点,并检查ucontext中的FPU数据,得到了以下内容。

(gdb) p/x *ucontext->uc_mcontext.fpregs
$2 = {cwd = 0x37f, swd = 0x0, ftw = 0x0, fop = 0x0, rip = 0x0, rdp = 0x0, mxcsr = 0x1f80, mxcr_mask = 0xffff
....

(gdb) p/x ucontext->__fpregs_mem
$3 = {cwd = 0xe670, swd = 0xffff, ftw = 0x7fff, fop = 0x0, rip = 0x0, rdp = 0x0, mxcsr = 0x37f, mxcr_mask = 0x0, _st = {{significand = {0x0,
        0x0, 0x0, 0x0}, exponent = 0x0, padding = {0x0, 0x0, 0x0}}, {significand = {0x1f80, 0x0, 0xffff, 0x0},

[令我惊讶的是,FP寄存器具有不同的数据,并且uc_mcontext.fpregs似乎具有__fpregs_mem偏移量的数据。

为什么会有区别,这两个字段应该包含相同的数据,不是吗?

我正在使用Ubuntu 16.04 X86_64,gcc版本5.4.0 20160609,GLIBC 2.23-0ubuntu10

linux signals x86-64 glibc x87
1个回答
0
投票

尽管在某种程度上我怀疑这是造成问题的原因,但在信号处理程序中调用getcontext(读为this)在技术上是错误的。如果您的目标是确定发生哪个浮点错误,则可以使用this

如果发布一些代码段,可能会更容易获得帮助。

© www.soinside.com 2019 - 2024. All rights reserved.