2009-04-04 4 views
0

HP-UX에서 Ruby 1.9.1-p0을 컴파일하려고합니다. ext/pty.c에 약간의 변경을 한 후에는 경고 메시지 (약 5K)가 붙지 만 성공적으로 컴파일됩니다. 내가 사용 자체 테스트를 실행하면 "시험을"이 충돌하고 다음과 같은 오류와 함께 코어 덤프 : 불법 명령은 시스템이 프로세스를 종료하기 위해 사용하는 단지 신호이 문제를 인터넷 검색에서"sendsig : useracc failed"진단/추적 방법. HP-UX의 문제

sendsig: useracc failed. 0x9fffffffbf7dae00 0x00000000005000

Pid 3044 was killed due to failure in writing the signal context - possible stack overflow.

Illegal instruction

, 문제와 관련이 없습니다. 신호 처리기를 호출 할 때 컨텍스트를 다시 설정하는 데 문제가있는 것 같습니다. 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 

답변

0

내 자신의 질문에 대답 :

문제는 스택이 너무 작았 할당되는 것이 었습니다. 그래서 정말 스택 오버 플로우였습니다. sendsig() 함수는 커널 공간에서 사용자 공간으로 복사 할 컨텍스트 구조를 준비하고있었습니다. useracc() 함수는 지정된 주소에 충분한 공간이 있는지 확인합니다.

Ruby 1.9.1-p0 코드는 생성 된 모든 스레드에 대해 스택을 할당하기 위해 PTHREAD_STACK_MIN을 사용하고있었습니다. HP-UX 설명서에 따르면 Itanium에서이 크기는 256KB이지만 헤더 파일을 검사했을 때 크기는 4KB 밖에되지 않습니다. useracc()의 오류 메시지는 20KB를 복사하려고 시도했음을 나타냅니다.

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