Appel de Java à partir de C ++: comment détecter / détecter une erreur JVM fatale?

Je développe un programme C ++ (Win32, MS Visual Studio 2008) qui crée une machine virtuelle Java via JNI, comme indiqué ici . Cela fonctionne bien depuis longtemps, avec Java 6 et Java 7.

Aujourd’hui, j’ai installé une nouvelle version de JRE. quelque chose s’est mal passé dans le programme d’installation et le JRE est corrompu. J’ai remarqué que mon programme C ++ ne démarre pas et n’émet aucun message d’avertissement. Le débogage du programme a montré qu’il fonctionnait correctement jusqu’à l’appel de JNI_CreateJavaVM ; mais l’appel de JNI_CreateJavaVM provoque l’arrêt immédiat du programme. Aucune valeur de retour, aucun message d’erreur, rien.

Oui, je sais que je dois simplement réinstaller JRE. Néanmoins, j’aimerais que mon programme C ++ soit préparé à une telle situation. Si vous ne parvenez pas à créer une machine virtuelle Java, le message “Veuillez réinstaller JRE” doit s’afficher. Mais je n’ai pas la chance de montrer ce message parce que tout le programme se termine.

Existe-t-il un moyen de détecter ce type d’erreurs dans JRE, ou plus généralement dans une bibliothèque tierce? J’ai essayé d’utiliser try/catch constructions try/catch C ++, j’ai essayé d’utiliser la fonction signal – rien n’y fait; le programme disparaît sans appeler les gestionnaires d’attrape ou de signal.

Existe-t-il un moyen de détecter un tel crash JRE? Ou bien: existe-t-il un moyen de détecter de manière fiable un plantage ou une fin dans une bibliothèque tierce?

Si vous utilisez Linux / Unix: c’est avec quoi je commence habituellement par:

 struct sigaction sa; sa.sa_handler = bt_sighandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); 

Si vous utilisez Microsoft C ++ sur Windows: _ try / _except fera généralement l’affaire. Il s’agit d’une extension MSVC (vous pouvez le deviner à partir du double trait de soulignement), qui étend le test / catch standard.

Try / catch intercepte les exceptions C ++, _ try / _except intercepte toutes les autres exceptions non gérées (COM, Win32, …). Par exemple, les problèmes d’access à la mémoire, qui sont probablement la cause de votre blocage, seront résolus. Lire ici

Sinon, dans les fenêtres , essayez SetUnhandledExceptionFilter

EDIT: puisque l’approche utilisant SEH semble échouer, vous pouvez passer d’un niveau supérieur à l’autre et utiliser la gestion des exceptions vectorielles. Selon ce billet de blog sur msdn , VEH est enregistré par processus et il est vérifié avant SEH.

Si tout échoue, ne désespérez pas 🙂 vous pouvez toujours transformer votre application en une paire debugger / debugee. Cela vous donnera un contrôle total sur les événements, la vie et la mort du processus de la débugée. Cela ne vaut généralement pas la peine, mais c’est une solution supplémentaire que j’avais à utiliser par le passé. Ce n’est pas aussi difficile que cela puisse paraître; si quelque chose échoue, faites le moi savoir et je vais extraire un vieux code.