_dl_close Ошибка подтверждения - PullRequest
6 голосов
/ 15 декабря 2008

Я использую dlopen () в модуле Apache, который я пишу, чтобы у меня была система плагинов для моего модуля. Я обнаружил, что если я скомпилирую свой модуль, скомпилирую свой плагин и запустю Apache, все будет работать безупречно.

Если, однако, после того, как я все это сделаю, я перекомпилирую свой плагин (сделав небольшое или два небольших изменения в коде плагинов), моя следующая загрузка страницы вызовет сбой Apache. Каждый последующий запрос снова работает отлично. Таким образом, только первая загрузка страницы сразу после компиляции вызывает ошибку segfault.

Я пытался решить эту проблему в течение нескольких дней (я не очень хорош в отладке C), и сегодня я заметил это в своих журналах ошибок apache:

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

Кто-нибудь знает, что происходит? Означает ли это, что это не мой код и я охотился за фантомной ошибкой? Я довольно уверен, что я вызываю dlcose () для каждого вызова dlopen (). Однако эта конкретная ошибка / ошибка возникает, когда я запускаю apache в однопроцессном режиме и начинаю быстро обновлять страницу.

1 Ответ

5 голосов
/ 15 декабря 2008

Некоторые идеи:

  1. Возможно, вы звоните dlopen() более одного раза? Библиотека dl поддерживает счетчики ссылок, которые увеличиваются на каждый dlopen(), поэтому dlclose() будет выгружать библиотеку ТОЛЬКО если счетчик == 0.

  2. Вы указали RTLD_NODELETE флаг для dlopen() (если вы работаете в Linux)? Если да, dlclose() не будет выгружать вашу библиотеку.

Вы пытались отлаживать системные вызовы с помощью strace? Запустите Apache, найдите его pid и отследите все системные вызовы Apache, вызвав strace -p<pid>. Возможно, это даст вам некоторое представление о том, что происходит.

...