Come diagnosticare / trace “sendsig: useracc non riuscita.” Problema in HP-UX

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

  •  23-08-2019
  •  | 
  •  

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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top