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.
- 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)
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.