Debugging des Java Native Interface (JNI)
Wenn Sie ein JNI-Problem vermuten, können Sie bestimmte Prüfungen ausführen, die für die Diagnose der JNI-Übergänge hilfreich sind.
- Das Programm stürzt während der Ausführung einer nativen Methode ab (sehr häufig auftretendes Problem).
- Das Programm stürzt einige Zeit, nachdem es von der nativen Methode zurückgekehrt ist, ab. Dies kommt vorwiegend während eines Grafikkontexts vor (nicht sehr häufig auftretendes Problem).
- Fehlerhafter JNI-Code führt zu Deadlock kurz nach der Rückkehr aus einer nativen Methode (gelegentlich auftretendes Problem).
Wenn Sie ein Problem bei der Interaktion zwischen benutzerdefiniertem nativen Code und der JVM vermuten (also ein JNI-Problem), können Sie bestimmte Prüfungen ausführen, die für die Diagnose der JNI-Übergänge hilfreich sind. Zur Ausführung dieser Prüfungen müssen Sie beim Start der JVM die Option -Xcheck:jni angeben.
- Ob sich dieser Aufruf und der Aufruf, durch den das JNI initialisiert wurde, in demselben Thread befinden.
- Ob die Objektparameter gültige Objekte sind.
- Ob lokale oder globale Verweise auf gültige Objekte verweisen.
- Gibt an, ob der Typ eines Felds mit dem Aufruf
Get<Type>Field
oderSet<Type>Field
übereinstimmt. - Ob statische und nicht statische Feld-IDs gültig sind.
- Ob Zeichenfolgen gültig und ungleich null sind.
- Ob Array-Elemente ungleich null sind.
- Die Array-Elementtypen.
Die Ausgabe von -Xcheck:jni wird im Standardfehlerdatenstrom angezeigt und hat ungefähr folgenden Wortlaut:
JVMJNCK059W: JNI warning in FindClass: argument #2 is a malformed identifier ("invalid.name")
JVMJNCK090W: Warning detected in com/ibm/examples/JNIExample.nativeMethod() [Ljava/lang/String];
- Die Fehlerkategorie (Fehler, Warnung oder Empfehlung).
- Die JNI-API, in welcher der Fehler festgestellt wurde.
- Eine Erläuterung des Problems.
Sie können zusätzliche Unteroptionen angeben, indem Sie -Xcheck:jni:<suboption>[,<...>]verwenden. Folgende Unteroptionen sind hilfreich:
- all
- Anwendungs- und Systemklassen prüfen.
- verbose
- Trace für bestimmte JNI-Funktionen und -Vorgänge durchführen.
- trace
- Trace für alle JNI-Funktionen durchführen.
- nobounds
- Keine Grenzprüfungen für Zeichenfolgen und Arrays durchführen.
- nonfatal
- Bei Erkennung von Fehlern nicht beenden.
- nowarn
- Warnungen nicht anzeigen.
- noadvice
- Empfehlungen nicht anzeigen.
- novalist
- Nicht auf va_list-Wiederverwendung prüfen (siehe Hinweis unten in diesem Abschnitt).
- pedantic
- Gründlichere, aber langsamere Prüfungen ausführen.
- valist
- Auf Wiederverwendung von 'va_list' prüfen (siehe Hinweis unten in diesem Abschnitt).
- help
- Hilfetext ausgeben.
Die Option -Xcheck:jni kann sich negativ auf die Leistung auswirken, da sie bei der Überprüfung der bereitgestellten Parameter sehr gründlich vorgeht.
Bei einigen Plattformen führt die Wiederverwendung einer 'va_list' in einem zweiten JNI-Aufruf (wenn CallStaticVoidMethod() beispielsweise zweimal mit denselben Argumenten aufgerufen wird) dazu, dass die va_list beschädigt wird und der zweite Aufruf fehlschlägt. Wenn Sie sicherstellen möchten, dass die va_list nicht beschädigt wird, verwenden Sie das C-Standardmakro va_copy() im ersten Aufruf. Standardmäßig sorgt -Xcheck:jni dafür, dass eine va_list nicht wiederverwendet wird. Inaktivieren Sie diese Prüfung nur dann mit der Unteroption novalist, wenn Ihre Plattform die Wiederverwendung einer va_list ohne va_copy zulässt. z/OS® -Plattformen ermöglichen die Wiederverwendung von va_list und standardmäßig wird -Xcheck:jni:novalist verwendet. Verwenden Sie zum Aktivieren der va_list -Wiederverwendungsprüfung die Option -Xcheck:jni:valist .