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년에 올렸는데 답글이 없는 것 같네요. 나는 이것이 단지 커널 버그이고 내 시스템에서 선택 사항이거나 비활성화된 것이 아니라고 생각합니다.

관련 정보