Consulte la pregunta MSO A long list of possible duplicates — C memory allocation and overrunning bounds para obtener información sobre preguntas relacionadas.Frente a un error "*** glibc detected *** free(): invalid next size (fast)"
ambiente Desarrollador: CentOS 4.7, 3.1.1 Kdevelop, gcc 3.4.6
que corren un cliente de prueba de Java que carga una biblioteca compartida C++ utilizando JNI. Hay tres componentes en mi solicitud,
- cliente Java
- C++ biblioteca compartida que actúa como un contenedor de JNI. (Lo llamaré "wrapperlibrary")
- Biblioteca compartida de C++ que contiene objetos comerciales. (Lo llamaré "businesslibrary")
Cuando ejecuto el cliente me topo con un error muy frecuente que es, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
. Este error viene por alrededor de 10 a 11 veces y luego se ejecuta la aplicación.
En mi cliente Java, primero cargar las bibliotecas necesarias C++ en un ctor estática de la siguiente manera,
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 "biblioteca de negocios cargado" comunicado que se imprime en la consola, pero después viene el error *** glibc...
.
En la configuración del proyecto de wrapperlibrary, businesslibrary se especifica como una biblioteca dependiente. Por lo tanto, incluso si omito la llamada a cargar businesslibrary y acaba de escribir,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
continuación, en primer lugar el businesslibrary se carga (visto a través de la creación registro global variable) y luego el wrapperlibrary se carga. El control vuelve al cliente Java y la instrucción "contenedor de la biblioteca cargada" se imprime en la consola. Después de esto hay una llamada al método nativo. Pero el control nunca llega a la implementación de este método nativo. Antes de eso, viene el error *** glibc...
. También si inserto una llamada al método estático de otra clase de Java antes de la llamada del método nativo como,
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;
--
--
}
entonces la salida de Try.temp() no se imprime.
¿Cuáles podrían ser las posibles razones del problema en ambos enfoques y cómo debo proceder?
Parece ser un problema en su biblioteca compartida. – Adil
Intenta valgrind it. –
@Laurynas - Valgrind me mostró dos errores pero mencionó solo las direcciones, no el código real, incluso en una compilación de depuración. Entonces, no sé qué hacer a continuación. Pegar un recorte de salida por falta de espacio. == 23002 == Salte a la dirección no válida indicada en la siguiente línea == 23002 == a 0x246: ??? == 23002 == La dirección 0x246 no está apilada, mallocada o (recientemente) libre de == 23002 == == 23002 == Proceso que termina con la acción predeterminada de la señal 11 (SIGSEGV) == 23002 == Permisos erróneos para la región mapeada en la dirección 0x246 == 23002 == a 0x246: ??? –