تصحيح أخطاء المكتبات المشتركة عن بعد باستخدام gdb/gdbserver

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

سؤال

سؤالي يتعلق بتصحيح أخطاء أحد التطبيقات عن بُعد على معالج ذراع مضمن باستخدام gdb/gdbserver.

يمكنني تصحيح أخطاء التطبيق نفسه، لكن التطبيق يرتبط ديناميكيًا بمكتبة مشتركة تنفذ بروتوكول اتصالات داخليًا.أريد أن أكون قادرًا على تعيين نقاط التوقف ضمن وظائف المكتبة المشتركة، لذا حاول اكتشاف بعض مشكلات اكتشاف الجهاز.

لقد تأكدت من أن المكتبة مجمعة برموز التصحيح ويتم تحميلها بواسطة gdb على الجانب المضيف، ويمكنني سرد ​​الوظائف داخل المكتبة وحتى تعيين نقاط التوقف ولكن بمجرد أن أحاول تشغيل التطبيق أحصل على رسالة خطأ إلى تأثير:

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

حيث X هو رقم نقطة التوقف في gdb وهو عنوان صغير جدًا ليكون صالحًا.
أنا أستخدم المكتبة الجديدة على كل من الجهاز الهدف والمضيف، ولكن عبر mount -o bind newlib oldlib على الهدف من جبل NFS.
هل لدى أي شخص فكرة عما يمكن أن يكون الخطأ؟شكرا لك مقدما.

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

المحلول

تخمين جامح:لقد قمت بتحميل المكتبة المشتركة إلى المضيف GDB على عنوان غير صحيح.

بدلاً من تحميله بشكل صريح في GDB، استخدم "set stop-on-solib-event on", ، انتظر حتى يتم تحميل المكتبة (info shared سيخبرك بالقائمة الحالية للمكتبات المحملة)، و ثم تعيين نقاط التوقف.

نصائح أخرى

أرى أن هذا السؤال يعود إلى عام 2009، ولكن الإجابات الحالية قديمة، لذا إليك تحديث:

اقترح @Employed Russian أنه يجب عليك استخدامه stop-on-solib-event.هذا لم يعد صحيحا؛يدعم NDK r8d نقاط التوقف المعلقة في المواد الصلبة التي لم يتم تحميلها بعد.

@ برنت بيدي يقول ذلك stop-on-solib-event لا يعمل مع gdbserver.وهذا أيضًا لم يعد صحيحًا منذ r8c على الأقل.تمتلك شركتي منتجًا يعتمد على سلوك NDK هذا من GDB، وسنكون في مشكلة كبيرة بدونه.

استخدم الأمر التالي لتعيين نقاط التوقف المعلقة التي سيتم حلها بعد تحميل مكتبة الكائنات المشتركة

set breakpoint pending on

للأسف لا يمكنك استخدام "set stop-on-solib-event on" لتصحيح أخطاء gdbserver عن بعد نظرًا لأن gdbserver لا يتعرف/يرسل أحداث solib.لقد اضطررت فقط إلى إصدار أمر set solib-search-path أو تعيين أمر sysroot للحصول على gdb لتحميل جميع رموز المكتبة المشتركة بعد الوصول إلى نقطة توقف على main.

تشغيل ما يصل إلى main وثم set solib-search-path .

خلاف ذلك، gdbserver يتوقف عند المحمل الديناميكي، قبل تحميل المكتبات.في main, يجب أن يكونوا جاهزين لـ GDB.

المزيد من التفاصيل: تصحيح أخطاء المكتبات المشتركة باستخدام gdbserver

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