진단/추적 방법 "SendSig : UserACC가 실패했습니다." HP-UX의 문제

StackOverflow https://stackoverflow.com/questions/717327

  •  23-08-2019
  •  | 
  •  

문제

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를 복사하려고했음을 나타냅니다.

따라서 스레드가 신호를 받으면 스택에서 신호 컨텍스트를 수신 할 공간이 충분하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top