فشل dlclose: تفاعل غريب بين مكتبات Rust و C++

2025-08-30

تروي هذه المشاركة قصة تصحيح أخطاء محيرة: عند استخدام `dlclose` لتحميل مكتبة ديناميكية، تم تفريغ المكتبة libA بنجاح، لكن مكتبة التبعية libB بقيت في الذاكرة بشكل غير متوقع. كشف التحقيق أن السبب الجذري هو مُدمرات التخزين المحلي للخيوط (TLS) المسجلة في libB. نظرًا لأن الخيوط لم تغادر، لم يتم تنفيذ هذه المُدمرات، مما منع تفريغ libB. أدى تمكين التسجيل إلى حل المشكلة، لأن مكتبة التسجيل استخدمت أيضًا TLS، مما منع تفريغ libA وبالتالي حافظ على حالة مشتركة متسقة بين libA و libB. تُبرز هذه الحالة أهمية فهم سلوك `dlclose` وتأثير مُدمرات TLS، وتوصي باستخدام متغير البيئة `LD_DEBUG` لتصحيح أخطاء المكتبات الديناميكية.