Comment diagnostiquer / trace « sendsig: useracc a échoué. » Problème dans HP-UX

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

  •  23-08-2019
  •  | 
  •  

Question

Je suis en train de compiler Ruby 1.9.1-p0 sur HP-UX. Après un petit changement au poste / pty.c il compile avec succès, mais avec un beaucoup des messages d'avertissement (environ 5 km). Quand je lance les auto-tests en utilisant « make test », il se bloque et core-dumps avec l'erreur suivante:

  

sendsig: useracc a échoué. 0x9fffffffbf7dae00 0x00000000005000

     

3044 a été tué Pid en raison de l'échec par écrit le contexte du signal -. Possible débordement de pile

     

Illegal instruction

De googler ce problème, l'instruction illégale est juste un signal que le système utilise pour tuer le processus, et non liés au problème. Il semblerait qu'il y ait un problème avec le rétablissement du contexte lors de l'appel du gestionnaire de signaux. Apporter le haut de base en gdb ne montre pas une pile particulièrement profonde, donc je ne pense pas que le « débordement de pile possible » est juste non plus.

La sortie pile gdb Backtrace ressemble à ceci:

#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
Était-ce utile?

La solution

Répondre à ma propre question:

Le problème est que la pile allouée était trop petite. Donc, il était vraiment un débordement de pile. La fonction sendsig () prépare une structure de contexte à copier de l'espace du noyau vers l'espace utilisateur. La fonction useracc () vérifie qu'il ya suffisamment d'espace à l'adresse indiquée pour le faire.

Le code de Ruby 1.9.1-p0 utilisait PTHREAD_STACK_MIN pour allouer la pile pour les threads créés. Selon la documentation HP-UX, sur Itanium est ce 256KB, mais quand j'ai vérifié les fichiers d'en-tête, il était seulement 4 Ko. Le message d'erreur de useracc () a indiqué qu'il essayait de copier 20KB.

Donc, si un fil a reçu un signal, il ne serait pas assez d'espace pour recevoir le contexte du signal sur sa pile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top