在对 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年就发过这个帖子,但好像没有任何回复。我认为这只是一个内核错误,而不是我的系统上可选和禁用的东西。