سؤال

أنا باستخدام dlopen() في وحدة اباتشي أن أكتب لدرجة أنني يمكن أن يكون نظام البرنامج المساعد من أجل وحدة بلدي.لقد وجدت أنه إذا كنت تجميع بلدي وحدة تجميع بلدي المساعد ، والبدء أباتشي, كل شيء يعمل خوخي-حريصا.

إذا, لكن, بعد أن فعلت كل هذا إعادة ترجمة البرنامج المساعد بلدي, (إجراء تغيير صغير أو اثنين إلى الإضافات البرمجية) القادم تحميل الصفحة سوف يسبب أباتشي إلى segfault.كل طلب لاحق يعمل على ما يرام مرة أخرى.وهكذا ، فمن أول صفحة التحميل مباشرة بعد تجميع ذلك يسبب segfault.

لقد كنت تحاول معالجة هذا لبضعة أيام (أنا لست كبيرة في ج التصحيح) و اليوم لاحظت هذا في بلدي أباتشي سجلات الخطأ:

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

أي شخص لديه أي فكرة ما الذي يحدث ؟ هل هذا يعني انها ليست لي و لقد تم صيد الوهمية علة ؟ أنا واثقة تماما أن أسميه dlcose() لكل مكالمة dlopen().بيد أن هذا الخطأ معينة/segfault يبدو أن يحدث عند تشغيل أباتشي في عملية وضع والبدء في تحديث الصفحة بسرعة.

هل كانت مفيدة؟

المحلول

بعض الأفكار:

  1. ربما كنت اتصل dlopen() أكثر من مرة ؟ dl وتحتفظ مكتبة مرجعية عدادات الذي يتزايد في كل dlopen() لذلك dlclose() سوف تحميل المكتبة إلا إذا كان العداد == 0.

  2. هل تحديد RTLD_NODELETE العلم dlopen() (على افتراض أنك على لينكس)?إذا كان الجواب نعم ، dlclose() لن تفريغ المكتبة الخاصة بك.

هل حاولت تصحيح syscalls مع strace?تبدأ أباتشي ، يجد pid و تتبع كل syscalls أباتشي لا طريق الاتصال strace -p<pid>.ربما هذا سوف أعطيكم فكرة عن بعض ما يجري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top