我在我正在编写的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并开始快速刷新页面时,似乎会发生这种特殊的bug/segfault.
一些想法:
可能你再打电话dlopen()
一次?dl
库维护其递增每个引用计数器dlopen()
,以便dlclose()
将卸载库只如果计数器== 0.
你有没有指定RTLD_NODELETE
标志dlopen()
(假设你在Linux上)?如果是,dlclose()
则不会卸载您的库.
您是否尝试使用调试系统调用strace
?启动Apache,找到它的pid并通过调用跟踪Apache没有的所有系统调用strace -p
.可能它会让你知道发生了什么.