_dl_close断言失败

时间:2008-12-15 02:11:50

标签: c apache debugging dlopen

我在我正在编写的Apache模块中使用dlopen(),这样我就可以为我的模块安装一个插件系统。我发现,如果我编译我的模块,编译我的插件,并启动Apache,一切都很好用。

但是,如果在完成所有这些操作之后,我重新编译了我的插件,(对插件代码进行了一些或两次更改),我的下一页加载将导致Apache出现段错误。每个后续请求再次正常工作。因此,只有在编译后立即加载第一页导致段错误。

我一直试图解决这个问题几天(我在C调试方面表现不佳)今天,我在apache错误日志中注意到了这一点:

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

任何人都知道发生了什么事吗?这是否意味着它不是我的代码而且我一直在寻找幻影错误?我相信每次调用dlopen()都会调用dlcose()。但是,当我在单进程模式下运行apache并开始快速刷新页面时,似乎会发生这种特殊的错误/段错误。

1 个答案:

答案 0 :(得分:5)

一些想法:

  1. 您可能再次致电dlopen()一次? dl库维护引用计数器,每dlopen()递增一次,因此dlclose()只有在计数器== 0时才会卸载库。

  2. 您是否为RTLD_NODELETE指定了dlopen()标志(假设您使用的是Linux)?如果是,dlclose()将不会卸载您的库。

  3. 您是否尝试使用strace调试系统调用?启动Apache,找到它的pid并通过调用strace -p<pid>跟踪Apache没有的所有系统调用。可能它会让你知道发生了什么。