FPU/SSE/AVX 寄存器是否未保存在核心转储中?

FPU/SSE/AVX 寄存器是否未保存在核心转储中?

在对 x86-64 应用程序进行事后调试时,我遇到了一个奇怪的症状:

(gdb) p/x $xmm1
$8 = {v4_float = {<unavailable>, <unavailable>, <unavailable>, <unavailable>}, v2_double = {<unavailable>, <unavailable>}, v16_int8 = {<unavailable> <repeats 16 times>}, v8_int16 = {<unavailable>, <unavailable>, 
    <unavailable>, <unavailable>, <unavailable>, <unavailable>, <unavailable>, <unavailable>}, v4_int32 = {<unavailable>, <unavailable>, <unavailable>, <unavailable>}, v2_int64 = {<unavailable>, <unavailable>}, 
  uint128 = <unavailable>}

困惑,然后我尝试过

(gdb) info all-registers
rax            0x7f4fb3286020   139980284911648
rbx            0x7fff90cbf720   140735622674208
rcx            0xffff0  1048560
rdx            0xffef0  1048304
rsi            0xfbeea0 16510624
rdi            0x7f4fb3386010   139980285960208
rbp            0x7fff90cbf6f0   0x7fff90cbf6f0
rsp            0x7fff90cad5e8   0x7fff90cad5e8
r8             0x7f4fb3386004   139980285960196
r9             0x4      4
r10            0x3      3
r11            0x246    582
r12            0xd466f0 13919984
r13            0xffff4  1048564
r14            0x7fff90cad620   140735622600224
r15            0x7fff90cad610   140735622600208
rip            0x7f4fc1c01728   0x7f4fc1c01728 <__memcpy_ssse3_back+7016>
eflags         0x10206  [ PF IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
st0            *value not available*
st1            *value not available*
st2            *value not available*
st3            *value not available*
st4            *value not available*
st5            *value not available*
st6            *value not available*
st7            *value not available*
fctrl          *value not available*
fstat          *value not available*
ftag           *value not available*
fiseg          *value not available*
fioff          *value not available*
foseg          *value not available*
---Type <return> to continue, or q <return> to quit---
fooff          *value not available*
fop            *value not available*
mxcsr          *value not available*
ymm0           *value not available*
ymm1           *value not available*
ymm2           *value not available*
ymm3           *value not available*
ymm4           *value not available*
ymm5           *value not available*
ymm6           *value not available*
ymm7           *value not available*
ymm8           *value not available*
ymm9           *value not available*
ymm10          *value not available*
ymm11          *value not available*
ymm12          *value not available*
ymm13          *value not available*
ymm14          *value not available*
ymm15          *value not available*

我认为这意味着核心转储不保存 FPU 和 SSE/AVX 状态。这是真的吗?或者这可能是 GDB 中的一个错误?如何检查核心文件本身是否包含这些寄存器的值?

GDB 是GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-64.el7.同样的事情出现在 Kubuntu 14.04 上,具有相同的可执行文件及其核心文件,其中 GDB 7.11 从源代码编译。

答案1

Linux 似乎确实没有为崩溃的线程保存这些寄存器。我试过了

eu-readelf --notes myapp.core

它只报告了PRSTATUS与崩溃相关的各种信号信息,但没有报告FPREGSET。有趣的是,其他线程似乎确实已FPREGSET保存在转储中。所以该文件只是缺少此信息。

我找到了一个LKML消息2014年就发过这个帖子,但好像没有任何回复。我认为这只是一个内核错误,而不是我的系统上可选和禁用的东西。

相关内容