2010-01-20 4 views
0

J'ai une classe Java qui appelle une classe C++ via une classe JNI C++ pour accéder à la fonctionnalité de commande 'fichier' fournie par libmagic.so.Erreur Redhat AS 4 Seg appelant magic_buffer en utilisant Java 1.6

  • La classe C++ compile et exécute bien en tant que C++ principal()

-Il fonctionne très bien sur RHEL 5 en cours d'exécution Java 1.5 et 1.6;

-il fonctionne très bien sur RHEL 4 course java 1,5

-it jette un défaut sur le seg 26234 RHEL 4 avec Java 1.6

Le défaut de seg:

  1. se produit à la appelez char * retptr = magic_buffer (cookie, bigbuf, 1000); Aucune erreur lorsque char * retptr = "une chaîne de caractères sûre"; est substitué. C'est pourquoi je conclus que la faute seg se produit à cet appel. J'utilise un appel alternatif, char * retptr = magic_file (cookie, "/ usr/include/magic.h"); pour déboguer les problèmes de tampon, car cet appel renvoie le même message de type de fichier nécessitant uniquement le nom de chemin d'accès complet du fichier, plutôt qu'un tampon complet du contenu du fichier. Il lance également le défaut seg sur la VM de test RHEL4/java 1.6. Ainsi, je conclus que le problème ne semble pas être de mauvais pointeurs ou des tampons débordants dans mon code.

  2. magic_buffer est un appel à libmagic.so. Dans le code précédemment, d'autres appels réussis à cette lib sont faits. Cet appel, cependant, implique la base de données lib magique/usr/share/file/magic.

  3. Compiler le C++ en tant qu'exécutable et l'exécuter sur la machine à problème fonctionne très bien.

Voici quelques conclusions:

A. Il y a implication JNI, en raison de # 4

B. En raison de # 1/# 2, je ne crois pas que ce soit une mise en œuvre JNI problème.

C. En raison de # 1, # 2 et # 4, je ne crois pas que ce soit un problème d'implémentation C++.

Des suggestions ou des commentaires? (initialement exécuté sur VMWare, maintenant testé sans implication VM)

+0

Est-ce que cela s'est produit après une mise à jour? Vous ne pouvez pas revenir à java 1.5 sur RHEL4? – stacker

+0

Il pourrait être utile d'examiner votre code C++ pour les experts JNI. –

+0

Aucune mise à jour n'était impliquée; ceci teste le nouveau développement. Nous avons un environnement mixte de RHEL4/5 et Java 1.5/1.6.Je voudrais identifier la cause du problème plutôt que de chercher une solution de contournement sans comprendre ce qui ne va pas. – cvsdave

Répondre

0

Ma première suggestion est d'essayer de trouver une alternative Java pure. This page énumère un certain nombre d'alternatives. Apache Tika et JMimeMagic semblent prometteurs.

Ma deuxième suggestion consiste à utiliser Process pour exécuter la commande file dans un processus distinct et d'extraire les informations dont vous avez besoin de la sortie standard de la commande. Cela peut avoir des problèmes de performance (ahem) si vous devez le faire des centaines de fois par seconde, mais pour une utilisation occasionnelle, ça devrait aller.

+0

La performance est la raison pour laquelle nous cherchons une alternative à la création d'un nouveau processus pour chaque instance. – cvsdave

+0

Puis voir la suggestion # 1 :-) –

+0

Je ne suggère pas # 1 aiderait. J'ai posté au-dessus de la ligne où la faute de seg se produit, et pourquoi je ne pense pas que les problèmes de tampon sont à blâmer. Ajouter du code supplémentaire ne ferait qu'obscurcir le problème. Voici du code: char * cptr = null; cptr = magic_file (cookie, "/ usr/include/magic.h"); cette ligne est l'endroit où le défaut seg se produit. Cette ligne est montrée ci-dessus. Notez que la discussion ci-dessus indique que le code fonctionne avec java 1.5, jette la faute seg seulement avec 1.6 sous certaines versions redhat. Le code C++ compile et s'exécute correctement sous toutes les versions d'OS et (bien sûr) les versions java. – cvsdave