2010-02-23 33 views
10

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,

  1. cliente Java
  2. C++ biblioteca compartida que actúa como un contenedor de JNI. (Lo llamaré "wrapperlibrary")
  3. 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?

+0

Parece ser un problema en su biblioteca compartida. – Adil

+1

Intenta valgrind it. –

+0

@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: ??? –

Respuesta

3

Podría ser que Java se vincule contra un glibc diferente que sus bibliotecas o que las bibliotecas estén vinculadas de manera diferente/a glibcs ​​diferentes.
También compruebe si una de las bibliotecas está enlazando con una versión de depuración del glibc (ese es el problema en Windows con la lib del tiempo de ejecución de C++). Intente vincular estáticamente sus bibliotecas con el glibc, o con el fin de excluir las posibilidades que enlazan su contenedor y sus bibliotecas de negocios de forma estática en una sola biblioteca.

+0

La solución es similar a su sugerencia, se relaciona con la vinculación. La biblioteca de negocios tiene su propia implementación anulada de caris apis anchos ya que está trabajando en Unicode de 2 bytes. Se esperaba que se vincule con estas apis, pero se vinculó dinámicamente a las API del sistema, que esperan un tamaño de 4. He cambiado los nombres de las API reemplazadas para corregir esto. Ahora tanto el contenedor como la biblioteca de negocios se vinculan con las api anuladas. Gracias. –

+0

@HS: si resuelve un problema usted mismo, puede publicar la solución como respuesta y aceptarla, para que otros puedan encontrarla. –

1

He encontrado este error críptico varias veces.

En cada caso, se produjo al hacer referencia a un miembro de la matriz que estaba fuera de la matriz. La referencia no causó un error de segmentación, ya que aún estaba dentro de los límites de otra matriz en el programa.Sin embargo, cuando fui a liberar el arreglo, las cosas se complicaron lo suficiente como para arrojar este error.

La solución fue comprobar muy cuidadosamente que cada matriz se asignó correctamente, y que las referencias a los miembros de la matriz nunca salieron de los límites.