تصحيح أخطاء المكتبات المشتركة عن بعد باستخدام gdb/gdbserver
-
18-09-2019 - |
سؤال
سؤالي يتعلق بتصحيح أخطاء أحد التطبيقات عن بُعد على معالج ذراع مضمن باستخدام 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