2008-12-15 21 views
6

Estoy usando dlopen() en un módulo de Apache que estoy escribiendo para poder tener un sistema de complemento para mi módulo. Descubrí que si compilo mi módulo, compilo mi complemento y empiezo Apache, todo funciona bien._dl_close Error de aserción

Si, sin embargo, después de haber hecho todo eso, vuelvo a compilar mi complemento (haciendo un pequeño cambio o dos en el código de los complementos) mi carga de la página siguiente provocará que Apache falle por segmentación. Cada solicitud posterior funciona bien, de nuevo. Por lo tanto, solo la carga de la primera página inmediatamente después de la compilación causa la segfault.

He estado tratando de hacer frente a este por unos días (no soy muy bueno para la depuración de C) y hoy en día, me di cuenta de esto en mis registros de errores de Apache:

Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed! 

Alguien tiene alguna idea de lo que es pasando? ¿Esto significa que no es mi código y que he estado buscando un error fantasma? Estoy bastante seguro de que llamo a dlcose() para cada llamada a dlopen(). Sin embargo, este error/segfault en particular parece ocurrir cuando ejecuto apache en modo de proceso único y comienzo a actualizar la página rápidamente.

Respuesta

5

Algunas ideas:

  1. Probablemente te llaman dlopen() más de una vez? dl biblioteca mantiene contadores de referencias que se incrementa en cada dlopen() por lo dlclose() descargará la biblioteca sólo si el contador == 0.

  2. ¿Ha especificado RTLD_NODELETE bandera para dlopen() (suponiendo que usted está en Linux)? Si es así, dlclose() no descargará su biblioteca.

¿Intentó depurar syscalls con strace? Inicie Apache, encuentre su pid y rastree todas las llamadas de sistema Apache doesn llamando al strace -p<pid>. Probablemente te dará una idea de lo que está pasando.

+0

¡Gracias por los comentarios! No estoy usando RTLD_NODELETE. Estoy bastante seguro de que estoy llamando a dllcose para cada llamada a dlopen (aunque en puntos claramente diferentes en el código). Comprobaré una vez más. –

Cuestiones relacionadas