échec _dl_close Assertion
Question
J'utilise dlopen () dans un module Apache que je suis en train d'écrire afin que je puisse avoir un système de plug-in pour mon module. J'ai trouvé que si je compile mon module, compilez mon plug-in, et commencer à Apache, tout fonctionne Peachy-vif.
Si, cependant, après avoir fait tout cela, je recompile mon plug-in, (un petit changement ou deux au code des plug-ins,) mon prochain chargement de la page, Apache segmentation fault. Chaque demande ultérieure fonctionne très bien, encore une fois. Ainsi, il est seulement la première charge de page immédiatement après la compilation qui provoque l'erreur de segmentation.
J'ai essayé d'aborder ce pendant quelques jours (je ne suis pas très au débogage C) et aujourd'hui, j'ai remarqué dans mes journaux d'erreur apache:
Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed!
Quelqu'un a une idée de ce qui se passe? Est-ce que cela veut dire qu'il est mon code et que j'ai été la chasse d'un bug fantôme? Je suis assez confiant que j'appelle dlcose () pour chaque appel à dlopen (). Cependant, ce bug particulier / segfault semble se produire quand je lance apache en mode mono-processus et commencer à rafraîchir la page rapidement.
La solution
Quelques idées:
-
Probablement vous appelez plus d'une fois
dlopen()
? Bibliothèque maintient les compteursdl
de référence qui est incrémentée à chaquedlclose()
afin déchargera laRTLD_NODELETE
bibliothèque SEULEMENT si le compteur == 0. -
Avez-vous spécifié drapeau pour
strace
strace -p<pid>
(supposant que vous êtes sous Linux)? Si oui, ne décharge pas <=> votre bibliothèque.
Avez-vous essayé de débogage syscalls avec <=>? Démarrer Apache, trouve son pid et trace tous syscalls Apache doesn en appelant <=>. Probablement il vous donnera une idée de ce qui se passe.