6

我在我正在编写的 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 并开始快速刷新页面时,似乎会发生这种特殊的错误/段错误。

4

1 回答 1

6

一些想法:

  1. 可能你打电话dlopen()不止一次?dl库维护引用计数器,每次递增,dlopen()因此dlclose()仅当计数器 == 0 时才会卸载库。

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

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

于 2008-12-15T05:51:44.080 回答