Linux

FPU/SSE/AVX 寄存器是否沒有保存在核心轉儲中?

  • September 15, 2016

在對我的 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 是從原始碼編譯的。

Linux 似乎沒有為崩潰的執行緒保存這些寄存器,這似乎是真的。我試過了

eu-readelf --notes myapp.core

它只報告PRSTATUS了崩潰的各種信號相關資訊,但沒有報告FPREGSET。有趣的是,其他執行緒似乎確實FPREGSET保存在轉儲中。所以文件只是缺少這個資訊。

我在 2014 年發現了一條關於此的LKML 消息,但似乎沒有任何回复。我認為這只是一個核心錯誤,而不是我的系統上可选和禁用的東西。

引用自:https://unix.stackexchange.com/questions/310082