Come diagnosticare / trace “sendsig: useracc non riuscita.” Problema in HP-UX
Domanda
Sto cercando di compilare Ruby 1.9.1-p0 su HP-UX. Dopo una piccola modifica al ext / pty.c si compila con successo, anche se con un molto di messaggi di avviso (circa 5K). Quando eseguo gli autotest utilizzando "make test" si blocca e core-dump con il seguente errore:
sendsig: useracc riuscita. 0x9fffffffbf7dae00 0x00000000005000
Pid 3044 è stato ucciso a causa di fallimento per iscritto contesto di segnale -. Possibile overflow dello stack
Istruzione non valida
Da googling questo problema l'istruzione illegale è solo un segnale che il sistema utilizza per uccidere il processo, e non correlati al problema. Sembrerebbe che ci sia un problema con il ristabilire il contesto quando si chiama il gestore di segnale. Portando il nucleo in gdb non mostra una pila particolarmente profonda, quindi non pensare alla "eventuale overflow dello stack" si adatta sia.
L'uscita gdb pila backtrace assomiglia a questo:
#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
Soluzione
Rispondendo alla mia domanda:
Il problema era che la pila in assegnata era troppo piccola. Così è stato davvero un overflow dello stack. La funzione sendsig () preparava una struttura contesto da copiare dallo spazio kernel spazio utente. La funzione useracc () controlla che ci sia spazio sufficiente all'indirizzo specificato di farlo.
Il rubino codice 1.9.1-p0 stava usando PTHREAD_STACK_MIN allocare stack per eventuali processi creati. Secondo la documentazione di HP-UX, su Itanium è 256KB, ma quando ho controllato i file header, era solo 4KB. Il messaggio di errore da useracc () ha indicato che stava cercando di copiare 20KB.
Quindi, se un thread ha ricevuto un segnale, non avrebbe abbastanza spazio per ricevere il segnale di contesto sul suo stack.