Os registradores FPU / SSE / AVX não são salvos nos dumps principais?

1

Durante a depuração pós-morte do meu aplicativo x86-64, me deparei com um sintoma estranho:

(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>}

Intrigado, tentei

(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*

Acredito que os core dumps não salvam o estado FPU e SSE / AVX. É verdade? Ou poderia ser um bug no GDB? Como posso verificar se o arquivo principal em si contém os valores para esses registros?

O GDB é GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-64.el7 . A mesma coisa aparece no Kubuntu 14.04 com o mesmo executável e seu arquivo principal com o GDB 7.11 compilado a partir de fontes.

    
por Ruslan 15.09.2016 / 14:49

1 resposta

1

Parece ser verdade que o Linux não salva esses registros para o encadeamento danificado. Eu tentei

eu-readelf --notes myapp.core

e informou apenas PRSTATUS e várias informações relacionadas a sinais para a falha, mas não FPREGSET . Curiosamente, outros segmentos parecem ter FPREGSET salvo no despejo. Então, o arquivo não tem essa informação.

Eu encontrei uma mensagem LKML sobre isso postada em 2014, mas não parece ter sido qualquer resposta. Presumo que isto seja apenas um erro do kernel, não algo opcional e desativado no meu sistema.

    
por 15.09.2016 / 15:05