linux - 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
解决方案
推荐阅读
- typescript - TypeScript - 你如何推断接口泛型参数
- r - 卡方检验失败
- css - CSS - @media 屏幕和(最大宽度:---px)在 Firefox 移动设备上不起作用
- javascript - 如何在异步函数中实现 Promise 的结果?
- android - Android Studio - CMake 错误:CMake 无法找到与“Ninja”对应的构建程序。CMAKE_MAKE_PROGRAM 未设置
- node.js - 为每个用户 nodejs 渲染信息
- c# - Oracle Advanced Queue 的消息状态在使用 ODP.net 出队后未更新
- weka - 显示加权平均的问号。weka中的精度
- for-loop - 为什么循环范围内没有增量,其范围是循环的长度,即使长度在循环内增加?
- mongodb - Mongodb 按功能分组,提供意外数据