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