Enfrentando un error "*** glibc detectado *** gratis(): siguiente tamaño no válido (rápido)"
Consulte la pregunta de MSO Una larga lista de posibles duplicados: asignación de memoria C y límites superados para obtener información sobre preguntas estrechamente relacionadas.
Entorno de desarrollador: CentOS 4.7, Kdevelop 3.1.1, gcc 3.4.6
Ejecuto un cliente de prueba de Java que carga una biblioteca compartida de C++ usando JNI. Hay tres componentes en mi aplicación,
- cliente java
- Biblioteca compartida de C++ que actúa como contenedor JNI. (Lo llamaré "biblioteca contenedora")
- Biblioteca compartida de C++ que contiene objetos comerciales. (Lo llamaré "biblioteca empresarial")
Cuando ejecuto el cliente me encuentro con un error muy frecuente que es: *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 ***
. Este error aparece entre 10 y 11 veces y luego se ejecuta la aplicación.
En mi cliente Java, primero cargo las bibliotecas C++ requeridas en un ctor estático 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 declaración "biblioteca empresarial cargada" se imprime en la consola, pero luego *** glibc...
aparece el error.
En la configuración del proyecto de wrapperlibrary, businesslibrary se especifica como una biblioteca dependiente. Entonces, incluso si omito la llamada para cargar businesslibrary y simplemente escribo,
static
{
System.Load("/root/Desktop/libs/wrapperlibrary");
System.out.println("wrapper library loaded");
}
luego, primero se carga la biblioteca empresarial (visto a través del registro de creación de variables globales) y luego se carga la biblioteca contenedora. El control regresa al cliente Java y la declaración "biblioteca contenedora 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. *** glibc...
Más bien antes de eso vuelve a aparecer el error . Además, si inserto una llamada al método estático de otra clase Java antes de la llamada al método nativo, como por ejemplo,
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() nunca se imprime.
¿Cuáles podrían ser las posibles razones del problema en ambos enfoques y cómo debo proceder?
Podría ser que el propio Java esté vinculado a un glibc diferente al de sus bibliotecas o que las bibliotecas estén vinculadas de manera diferente/a diferentes glibcs.
También verifique si una de las bibliotecas está vinculada a una versión de depuración de glibc (solucione ese problema en Windows con la biblioteca de tiempo de ejecución de C++). Intente vincular sus bibliotecas estáticamente con glibc, o para excluir posibilidades de vincular su contenedor y bibliotecas comerciales estáticamente en una biblioteca.
Me he encontrado con este error críptico varias veces.
En cada caso, fue causado por hacer referencia a un miembro de la matriz que estaba fuera de la matriz. La referencia no provocó un error de segmentación, ya que todavía estaba dentro de los límites de otra matriz del programa. Sin embargo, cuando fui a liberar la matriz, las cosas estaban lo suficientemente mal como para generar este error.
La solución fue verificar con mucho cuidado que cada matriz estuviera asignada correctamente y que las referencias a los miembros de la matriz nunca se salieran de los límites.