6

私が書いている Apache モジュールで dlopen() を使用しているので、モジュールのプラグイン システムを使用できます。モジュールをコンパイルし、プラグインをコンパイルし、Apache を起動すると、すべてがうまく機能することがわかりました。

ただし、すべての作業を行った後でプラグインを再コンパイルすると (プラグイン コードに小さな変更を 1 つか 2 つ加えると)、次のページの読み込みで Apache にセグメンテーション違反が発生します。後続の各リクエストは、再び正常に機能します。したがって、segfault の原因となるのは、コンパイル直後の最初のページの読み込みだけです。

私は数日間これに取り組もうとしてきました (私は 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. (Linux を使用していると仮定して)RTLD_NODELETEのフラグを指定しましたか? dlopen()はいの場合dlclose()、ライブラリをアンロードしません。

でシステムコールをデバッグしようとしましたstraceか? Apache を起動し、その pid を見つけて、Apache が呼び出すすべてのシステムコールをトレースしstrace -p<pid>ます。おそらく、何が起こっているのかをある程度理解できるでしょう。

于 2008-12-15T05:51:44.080 に答える