Veuillez consulter la question MSO A long list of possible duplicates — C memory allocation and overrunning bounds pour obtenir des informations sur des questions connexes.Faire face à une erreur "*** glibc détecté *** gratuit(): invalide taille suivante (rapide)"
environnement de développement: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6
je lance un client de test Java qui charge une bibliothèque C++ partagée en utilisant JNI. Il y a trois éléments dans ma demande,
- client Java
- C++ bibliothèque partagée qui agit comme une enveloppe JNI. (Je l'appellerai "wrapperlibrary")
- Bibliothèque partagée C++ contenant des objets métier. (Je l'appellerai « businesslibrary »)
Quand je lance le client face à une erreur, je très fréquemment, ce qui est, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
. Cette erreur survient environ 10 à 11 fois, puis l'application s'exécute.
Dans mon client Java, je d'abord charger les bibliothèques C++ nécessaires dans un cteur statique comme suit,
static
{
System.Load("/root/Desktop/libs/businesslibrary");
System.out.println("business library loaded");
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
La déclaration « bibliothèque d'affaires chargée » est imprimé sur la console, mais après l'erreur *** glibc...
vient.
Dans les paramètres du projet de la bibliothèque wrapper, la bibliothèque commerciale est spécifiée en tant que bibliothèque dépendante. Donc, même si je laisse de côté l'appel à charger businesslibrary et il suffit d'écrire,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
puis tout d'abord le businesslibrary obtient chargé (vu par l'exploitation forestière de création variable globale), puis le wrapperlibrary être chargée. Le contrôle revient au client java et l'instruction "bandothèque chargée" est imprimée sur la console. Après cela, il y a un appel à la méthode native. Mais le contrôle n'atteint jamais l'implémentation de cette méthode native. Plutôt avant que l'erreur *** glibc...
vient à nouveau. De plus, si j'insère un appel à la méthode statique d'une autre classe java avant l'appel de la méthode native tels que,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string.
native method call;
--
--
}
puis sortie Try.temp() n'est imprimé.
Quelles pourraient être les raisons possibles du problème dans ces deux approches et comment dois-je procéder?
Semble être un problème dans votre bibliothèque partagée. – Adil
Essayez de le valgrind. –
@Laurynas - Valgrind m'a montré deux erreurs mais a mentionné seulement les adresses pas le code réel, même sur une version de débogage. Donc, je ne sais pas quoi faire ensuite. Coller un extrait de sortie par manque d'espace. == 23002 == Aller à l'adresse invalide indiquée sur la ligne suivante == 23002 == à 0x246: ??? == 23002 == L'adresse 0x246 n'est pas empilée, malloc'd ou (récemment) libre == 23002 == == 23002 == Processus se terminant par l'action par défaut du signal 11 (SIGSEGV) == 23002 == Mauvaises permissions pour la région mappée à l'adresse 0x246 == 23002 == à 0x246: ??? –