Débogage de JNI
Si vous pensez être confronté à un problème JNI, vous pouvez exécuter des vérifications pour identifier les problèmes de transitions JNI.
- Le programme plante au cours de l'exécution d'une méthode native (erreur la plus courante).
- Le programme plante à la fin de la méthode native, généralement lors de la récupération de place (pas très courant).
- Du code JNI erroné provoque des interblocages peu après l'exécution d'une méthode native (occasionnel).
Si vous pensez qu'il existe un problème d'interaction entre le code natif écrit par l'utilisateur et la JVM (à savoir, un problème JNI), vous pouvez exécuter des vérifications pour identifier les problèmes de transitions JNI. Pour exécuter ces vérifications, spécifiez l'option -Xcheck:jni lorsque vous démarrez la machine virtuelle Java.
- si l'appel et l'appel qui a initialisé JNI se trouvent dans la même unité d'exécution
- si les paramètres d'objet sont des objets valides
- si les références locales ou globales font référence à des objets valides
- Indique si le type d'une zone correspond à l'appel
Get<Type>FieldouSet<Type>Field. - si les ID des champs statiques et non statiques sont valides
- si les chaîne sont valides et non null
- si les éléments de tableau ne sont pas null.
- les types des éléments de tableau
La sortie de -Xcheck:jni s'affiche dans flux d'erreurs standard et se présente comme suit :
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];
- le niveau d'erreur (erreur, avertissement ou conseil)
- l'API JNI dans laquelle l'erreur a été détectée
- l'explication du problème
Vous pouvez spécifier des sous-options supplémentaires à l'aide de -Xcheck:jni:<suboption>[,<...>]. Les sous-options utiles sont :
- all
- Vérifie les classes d'application et système.
- verbose
- Trace certaines fonctions et activités JNI.
- trace
- Trace toutes les fonctions JNI.
- nobounds
- Ne vérifie pas les limites dans les chaînes et les tableaux.
- nonfatal
- Ne quitte pas lorsque des erreurs sont détectées.
- nowarn
- N'affiche pas d'avertissements.
- noadvice
- N'affiche pas de conseils.
- novalist
- Ne recherche pas la réutilisation de va_list (voir la note à la fin de cette section).
- pedantic
- Exécute des vérifications plus approfondies, mais plus lentement.
- valist
- Recherche la réutilisation de va_list (voir la note à la fin de cette section).
- help
- Affiche des informations d'aide.
L'option -Xcheck:jni peut réduire les performances, car elle est valide avec soigneusement les paramètres fournis.
Sur certaines plateformes, la réutilisation de va_list dans un second appel JNI (par exemple, pour appeler CallStaticVoidMethod() deux fois avec les mêmes arguments) endommage va_list et le second appel échoue. Pour que va_list ne soit pas endommager, utilisez la macro C standard va_copy() dans le premier appel. Par défaut, -Xcheck:jni vérifie que les va_lists ne sont pas réutilisés. Utilisez la sous-option novalist pour désactiver cette vérification uniquement si la plateforme permet de réutiliser va_list sans va_copy. Les plateformes z/OS® permettent la réutilisation de va_list et, par défaut, -Xcheck:jni:novalist est utilisé. Pour activer la vérification de la réutilisation de va_list , utilisez l'option -Xcheck:jni:valist .