我正在尝试在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