Wie zu diagnostizieren / trace „sendsig: useracc fehlgeschlagen.“ Problem in HP-UX

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

  •  23-08-2019
  •  | 
  •  

Frage

Ich versuche, Ruby-1.9.1-p0 auf HP-UX zu kompilieren. Nach einer kleinen Änderung ext / pty.c kompiliert es erfolgreich, wenn auch mit einem Los von Warnmeldungen (etwa 5K). Als ich die Selbsttests mit „make test“ laufen stürzt und Core-Dumps mit dem folgenden Fehler:

  

sendsig: useracc fehlgeschlagen. 0x9fffffffbf7dae00 0x00000000005000

     

Pid 3044 wurde das Schreiben des Signals Kontext zum Scheitern getötet wegen -. Möglich Stapelüberlauf

     

Illegal instruction

Von googeln dieses Problem der illegalen Befehl ist nur ein Signal, dass das System den Prozess zu töten verwendet, und nicht mit dem Problem. Es scheint, dass es ein Problem mit der Wiedereinführung der Kontext, wenn das Signal-Handler aufrufen. den Kern in gdb zu bringen zeigt keinen besonders Deep Stack, so dass ich glaube nicht, das „möglich Stack-Überlauf“ rechts entweder ist.

Der gdb Stapel Backtrace Ausgabe sieht wie folgt aus:

#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
War es hilfreich?

Lösung

Die Beantwortung meiner Frage:

Das Problem war, dass der Stapel war zu klein zugeordnet ist. So war es wirklich ein Stapelüberlauf. Die sendsig () Funktion wurde eine Kontextstruktur Herstellung von Kernraum zu Benutzerraum kopiert werden. Die useracc () Funktion überprüft, dass es unter der Adresse genügend Platz ist angegeben, dies zu tun.

The Ruby 1.9.1-p0 Code wurde mit PTHREAD_STACK_MIN den Stapel für alle Threads erstellt zuzuordnen. Laut HP-UX Dokumentation, auf Itanium ist dies 256KB, aber wenn ich die Header-Dateien überprüft, es war nur 4 KB. Die Fehlermeldung von useracc () darauf hingewiesen, dass es versucht, 20KB zu kopieren.

Also, wenn ein Thread ein Signal empfangen wird, wäre es nicht genug Platz hat, um das Signal Kontext auf seinem Stapel zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top