2015-08-26 2 views
1

J'ai un code Fortran que mon client me donne il y a plusieurs mois, nous avons fait l'implémentation C (JNI) avec la déclaration de Fortran comme méthode externe et ensuite nous pouvons appeler fortran de C et maintenant nous pouvons appelez C depuis JAVA.Erreur dans java jni natif

Il fonctionne très bien (presque :)) en fait dans 1 de 8 bibliothèque, parfois nous avons un segfault avec

Stack: [0x00007f1ea63fc000,0x00007f1ea6afd000], sp=0x00007f1ea6af8f30, free space=7155k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
C [libCMordor.so+0x5240] long double restrict+0xcac 
C [libCMordor.so+0x1f84] unsigned long+0xbc8 

Je ne sais pas ce qui peut causer un long double restrict?

la valeur d'un résultat est plus grande qu'un long double? ou autre chose?

Si quelqu'un peut m'aider à me montrer le bon moyen de trouver ma solution, j'apprécierai.

beaucoup. PS: je ne veux pas savoir si mon code est correct ou non car tout fonctionne bien depuis plusieurs mois, donc je ne poste pas de code ici, mais je veux juste connaître la cause potentielle d'un long problème de double restriction ;)

EDIT1

Enfin je trouve ma solution, je suppose. J'ai mis le log dans fortran et pour une raison que je ne comprends pas maintenant, parce que le code n'est pas de moi et je ne sais rien de fortran, j'ai une valeur qui était 1 dans beaucoup de temps et parfois ceci La valeur est 1078334587, donc je vais renvoyer le code au client et l'homme qui a écrit ce code peut le corriger.

Je pense que c'est une valeur non initialisée qui a été obtenue par fortran et l'adresse contient une grande valeur en mémoire et cause sigsev!

+0

Vous avez jeté un coup d'œil à [this] (http://stackoverflow.com/questions/28403852/jvm-crash-due-to-sigsegv)? – Youka

+0

oui je trouve 2 ou 3 sujet à ce sujet sur débordement de pile mais personne n'explique clairly long double restrict. Tous les sujets donnent une solution pour essayer de résoudre le problème de segfault, mais il est trop générique, moi je veux comprendre la cause avant de tester tout le chemin. Et enfin j'ai ajouter le log dans le code fortran, et je vois qu'une valeur dans beaucoup de cas est 1 et pour une raison quelconque cette valeur devient '1078334587' je pense que c'était une valeur dans la mémoire qui n'est pas réinitialisée. mais avec cela, je pense que le problème est que la valeur est plus grande que l'objet et provoquer sigsev. –

Répondre

0

Finalement, le problème était une variable non-initialisée dans fortran! La variable a pris la valeur en mémoire et dit "long double restrict" et envoie un signal SIGSEV. J'ai initialisé la valeur et tout fonctionne bien maintenant. pour trouver ce problème, car ce n'est pas mon code, je l'ai mis en écriture pour me montrer où est le problème.

Et cela explique pourquoi le programme fonctionne correctement au hasard.