Fehlerquelle suchen

Wenn ein Stack-Trace vorhanden ist, sollte Ihnen die Überprüfung der Funktion, die am Fehlerpunkt ausgeführt wird, einen guten Hinweis auf den Code geben, der den Fehler verursacht hat, und ob der Fehler im IBM® JVM-Code enthalten ist oder durch den JNI-Code der Anwendung oder des Anbieters verursacht wird.

Wenn dbx keinen Stack-Trace generiert, gibt es für den Absturz zwei mögliche Ursachen:
  • Ein Stacküberlauf des nativen AIX® -Stacks
  • Java™ -Code wird ausgeführt (JIT kompiliert oder interpretiert)

Eine fehlgeschlagene Anweisung, die von dbx als stwu gemeldet wird, gibt an, dass möglicherweise ein Stacküberlauf aufgetreten ist. Beispiel:

Segmentation fault in strlen at 0xd01733a0 ($t1)
0xd01733a0 (strlen+0x08) 88ac0000        stwu    r1,-80(r1)
Sie können die erste Ursache ermitteln, indem Sie den dbx Befehl thread info verwenden und den Stackzeiger, den Stackgrenzwert und die Stackbasiswerte für den aktuellen Thread anzeigen. Wenn der Wert des Stackzeigers ungefähr dem Stackbasiswert entspricht, ist unter Umständen ein Stacküberlauf aufgetreten. Ein Stacküberlauf tritt auf, weil der Stack unter AIX von der Stackbegrenzung nach unten in Richtung der Stackbasis wächst. Wenn es sich bei dem Problem um einen nativen Stacküberlauf handelt, können Sie den Überlauf beheben, indem Sie die Größe des nativen Stacks von der Standardgröße von 400K erhöhen, indem Sie die Befehlszeilenoption -Xss < size>verwenden. Unabhängig von der fehlgeschlagenen Anweisung nach einem Stacküberlauf suchen. Um die Möglichkeit eines JVM-Absturzes zu verringern, müssen Sie eine geeignete native Stackgröße festlegen, wenn Sie ein Java-Programm mit vielen nativen Stacks ausführen.
(dbx) thread info 1
 thread  state-k     wchan    state-u    k-tid   mode held scope function
>$t1     run                  running    85965     k   no   sys  oflow


      general:
         pthread addr = 0x302027e8         size         = 0x22c
         vp addr      = 0x302057e4         size         = 0x294
         thread errno = 0
         start pc     = 0x10001120
         joinable     = yes
         pthread_t    = 1
      scheduler:
         kernel       =
         user         = 1 (other)
      event :
         event        = 0x0
         cancel       = enabled, deferred, not pending
      stack storage:
         base         = 0x2df23000         
			 size         = 0x1fff7b0
          limit         = 0x2ff227b0
          sp           = 0x2df2cc70

Was die zweite Ursache betrifft, ist dbx nicht mit der Struktur von JIT- und der Interpreter-Stack-Frames vertraut und kann daher aus diesen keinen Stack-Trace generieren. Der Java-Speicherauszug unterliegt jedoch nicht dieser Einschränkung und kann zur Prüfung der Stack-Trace verwendet werden. Ein Fehler im JIT-kompilierten Code kann anhand der Anleitung zur JIT-Fehlerbestimmung überprüft und untersucht werden. Informationen hierzu finden Sie unter Diagnosing a JIT or AOT problem in der J9 VM-Referenz.