Linux
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 是從原始碼編譯的。
Linux 似乎沒有為崩潰的執行緒保存這些寄存器,這似乎是真的。我試過了
eu-readelf --notes myapp.core
它只報告
PRSTATUS
了崩潰的各種信號相關資訊,但沒有報告FPREGSET
。有趣的是,其他執行緒似乎確實FPREGSET
保存在轉儲中。所以文件只是缺少這個資訊。我在 2014 年發現了一條關於此的LKML 消息,但似乎沒有任何回复。我認為這只是一個核心錯誤,而不是我的系統上可选和禁用的東西。