진단/추적 방법 "SendSig : UserACC가 실패했습니다." HP-UX의 문제
문제
HP-UX에서 Ruby 1.9.1-P0을 컴파일하려고합니다. ext/pty.c로의 작은 변화 후에는 성공적으로 컴파일됩니다. 많은 경고 메시지 (약 5k). "Make Test"를 사용하여 자체 테스트를 실행하면 다음 오류로 충돌하고 코어 덤프를 실행합니다.
SendSig : userAcc가 실패했습니다. 0x9FFFFFFBF7DAE00 0x000000005000
PID 3044는 신호 컨텍스트 서면 - 가능한 스택 오버 플로우에 실패하여 사망했습니다.
불법 교육
이 문제에 대해이 문제를 해결함으로써 불법 지시는 시스템이 프로세스를 죽이는 데 사용하고 문제와 관련이 없다는 신호 일뿐입니다. 신호 핸들러를 호출 할 때 컨텍스트를 재건하는 데 문제가있는 것 같습니다. GDB로 코어를 가져 오는 것은 특히 깊은 스택을 보여주지 않으므로 "가능한 스택 오버플로"도 옳지 않다고 생각합니다.
GDB 스택 백트레이스 출력은 다음과 같습니다.
#0 0xc00000000033a990:0 in __ksleep+0x30 () from /usr/lib/hpux64/libc.so.1
#1 0xc0000000001280a0:0 in __mxn_sleep+0xae0 ()
from /usr/lib/hpux64/libpthread.so.1
#2 0xc0000000000c0f90:0 in <unknown_procedure> + 0xc50 ()
from /usr/lib/hpux64/libpthread.so.1
#3 0xc0000000000c1e30:0 in pthread_cond_timedwait+0x1d0 ()
from /usr/lib/hpux64/libpthread.so.1
해결책
내 자신의 질문에 대답 :
문제는 할당 된 스택이 너무 작다는 것입니다. 그래서 그것은 실제로 스택 오버플로였습니다. SendSig () 함수는 커널 공간에서 사용자 공간으로 복사 할 컨텍스트 구조를 준비하는 것이 었습니다. userAcc () 함수는 지정된 주소에 충분한 공간이 있는지 확인합니다.
루비 1.9.1-p0 코드는 pthread_stack_min을 사용하여 생성 된 스레드에 대한 스택을 할당했습니다. HP-UX 문서에 따르면, Itanium에서 이것은 256KB이지만 헤더 파일을 확인했을 때 4KB에 불과했습니다. userAcc ()의 오류 메시지는 20KB를 복사하려고했음을 나타냅니다.
따라서 스레드가 신호를 받으면 스택에서 신호 컨텍스트를 수신 할 공간이 충분하지 않습니다.