تحليل بعد الوفاة بعد الوفاة دون وجود رموز تصحيح دقيقة لمكتبات النظام المشترك

StackOverflow https://stackoverflow.com/questions/4329986

سؤال

كيف تتجول عادة في هذه المشكلة؟ تخيل أن مؤشر ترابط يتعطل داخل رمز LIBC (وهو مكتبة مشتركة للنظام) على Computer1 ثم يقوم بإنشاء COREDump. لكن Computer2 الذي سيتم تحليله من خلال هذا coredump قد يحتوي على نسخة مختلفة من Libc.

لذا:

  1. ما مدى أهمية وجود نفس المكتبة المشتركة على الكمبيوتر البعيد؟ هل سيقوم GDB بإعادة بناء StackTrace بشكل صحيح دون وجود نفس إصدار Libc على Conputer2؟

  2. ما مدى أهمية وجود رموز تصحيح صحيحة لـ LIBC؟ هل سيقوم GDB بإعادة بناء stacktrace بشكل صحيح دون أن يكون لديه نفس رموز التصحيح على الكمبيوتر 2؟

  3. وما هي الطريقة "الصحيحة" لتجنب مشكلة عدم تطابق رمز التصحيح هذه لمكتبات النظام المشتركة؟ بالنسبة لي يبدو أنه لا يوجد حل واحد يحل هذه المشكلة بطريقة أنيقة؟ ربما يمكن لأي شخص مشاركة تجربته؟

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

المحلول

  1. هذا يعتمد. على بعض المعالجات ، مثل x86_64, ، صحيح واصفات الاسترخاء مطلوبة لـ GDB للاسترخاء بشكل صحيح المكدس. على مثل هذا الجهاز ، من المحتمل أن ينتج تحليل Coredump مع LIBC غير المتطابقة القمامة الكاملة.

  2. لا تحتاج إلى رموز التصحيح لـ LIBC للحصول على تتبع المكدس. لن تحصل على أرقام ملفات وخطوط بدون رموز تصحيح ، ولكن يجب أن تحصل على أسماء وظائف صحيحة (باستثناء عند التحضير).

  3. فرضية سؤالك خاطئة - لا علاقة لرموز التصحيح بهذا. الطريقة "الصحيحة" لتحليل Coredump على C2 ، عندما تم إنتاج هذا coredump على C1 ، هي الحصول على نسخة من مكتبات C1 (على سبيل المثال /tmp/C1/lib/...) وتوجيه GDB لاستخدام تلك النسخة بدلاً من تثبيت C2 libc مع

    (gdb) set solib-absolute-prefix /tmp/C1

يأمر.

ملحوظة: أعلاه الإعداد يجب تكون سارية قبل تحميل النواة في GDB. هذه:

gdb exe core
(gdb) set solib-absolute-prefix /tmp/C1

لن يعمل (تتم قراءة Core قبل أن يكون الإعداد ساريًا).

ها هي الطريقة الصحيحة:

gdb exe
(gdb) set solib-absolute-prefix /tmp/C1
(gdb) core core

(حاولت العثور على إشارة إلى هذا على الويب ، لكن لم أفعل).

ما هي الواصفات الاسترخاء؟

مطلوب واصفات الاسترخاء عند تجميع الكود بدون مؤشرات الإطار (افتراضي لـ x86_64 في الوضع الأمثل). مثل هذا الرمز ليس Save ٪ RBP Record ، وبالتالي يجب إخبار GDB كيفية "التراجع" من الإطار الحالي إلى إطار المتصل (تُعرف هذه العملية أيضًا باسم Stack Roffing).

لماذا لم يتم تضمين libc.so من C1 في النواة؟

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

باستثناء هذا لا يعمل عند تحليل جوهر C1 على C2!

تتيح بعض أنظمة التشغيل (ولكن ليس كلها) تكوين "Coredumps الكامل" ، حيث سيقوم نظام التشغيل بإلقاء تعيينات للقراءة فقط ، على وجه التحديد حتى تتمكن من تحليل النواة على أي جهاز.

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