Como diagnosticar / trace “sendsig: useracc falhou.” problema na HP-UX
Pergunta
Eu estou tentando compilar Ruby 1.9.1-p0 no HP-UX. Depois de uma pequena alteração para ext / pty.c ele compila com sucesso, embora com um muito de mensagens de aviso (cerca de 5K). Quando eu executar os auto-testes usando "make test" ele trava e core-despeja com o seguinte erro:
sendsig: useracc falhou. 0x9fffffffbf7dae00 0x00000000005000
Pid 3044 foi morto devido a uma falha ao escrever o contexto sinal -. Possível estouro de pilha
Instrução inválida
De pesquisando este problema a instrução ilegal é apenas um sinal de que os usos do sistema para matar o processo, e não relacionado com o problema. Parece que há um problema com a re-estabelecer o contexto ao chamar o manipulador de sinal. Trazendo o núcleo em gdb não mostra uma pilha particularmente profundo, então eu não acho que o "possível estouro de pilha" é a correcta.
Os gdb pilha backtrace olhares saída como esta:
#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
Solução
Respondendo a minha própria pergunta:
O problema era que a pilha que está sendo atribuído era muito pequeno. Então, ele realmente foi um estouro de pilha. A função sendsig () foi a preparação de uma estrutura de quadro para ser copiado do espaço de núcleo ao espaço do usuário. O useracc () função verifica que não há espaço suficiente no endereço especificado para fazê-lo.
O código 1.9.1-p0 Rubi estava usando PTHREAD_STACK_MIN para alocar a pilha para todos os tópicos criados. De acordo com a documentação do HP-UX, em Itanium este é 256KB, mas quando eu chequei os arquivos de cabeçalho, foi apenas 4KB. A mensagem de erro a partir useracc () indicou que estava tentando copiar 20KB.
Então, se um fio recebeu um sinal, ele não tem espaço suficiente para receber o contexto sinal em seu stack.