首页 > 解决方案 > X86_64 Linux 中 uc_mcontext->fpregs 和 ucontext->__fpregs_mem 中不同的寄存器数据

问题描述

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

标签: linuxsignalsx86-64glibcx87

解决方案


在信号处理程序中调用 getcontext (阅读内容)在技术上是不正确的,尽管我有点怀疑这是您的问题的原因。如果您的目标是确定发生了哪个浮点错误,那么您可以使用

如果您发布一些代码片段,可能会更容易提供帮助。


推荐阅读