سؤال

لقد حاولت تصحيح أخطاء تطبيق 32 بت عن بعد على نظام التشغيل x86_64 suse linux، ولكنني تلقيت هذا الخطأ "التسجيل البعيد منسق بشكل سيء".

أقوم بتشغيل gdbserver للاستماع على المنفذ 12345 (gdbserver localhost:12345 my_prog)

وهذا هو الخطأ:

$ gdb
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
(gdb) target remote <ip>:12345
Remote debugging using <ip>:12345
Remote register badly formatted: T0506:0000000000000000;07:80b8bcff00000000;10:4028f0f700000000;
here: 0000000;07:80b8bcff00000000;10:4028f0f700000000;
(gdb)

هذا هو جهاز خادم تصحيح الأخطاء (uname -a):

خادم Linux 2.6.16.60-0.31-smp #1 SMP الثلاثاء 7 أكتوبر 16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

وهذا هو جهاز العميل لتصحيح الأخطاء (uname -a):

عميل Linux 2.6.16.54-0.2.5-default #1 الإثنين 21 يناير 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

كلا الجهازين يعملان في أجهزة افتراضية بالرغم من (VMWare).يتم نسخ الملف الثنائي gdbserver من جهاز العميل إلى جهاز الخادم.

(أقوم بتصحيح الأخطاء عن بُعد لأن بيئة التشغيل على خادم تصحيح الأخطاء تشبه بيئة الإنتاج، ولا تحتوي على أي أدوات تطوير، أو إمكانية الوصول إلى التعليمات البرمجية المصدر، وما إلى ذلك.)

أي اقتراحات هي موضع ترحيب.

تحديث: نجح هذا بالنسبة لي عن طريق إصدار الأمر التالي في gdb:

تعيين البنية i386:x86-64

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

المحلول

ربما تحتاج إلى تنفيذ شيء من هذا القبيل set architecture i386 في ال (gdb) اِسْتَدْعَى؟ماذا فعلت show architecture قل بعد الاتصال بالهدف البعيد؟

نصائح أخرى

يمكن لـ GDB 64 بت أن يقوم مباشرة بتصحيح كل من العمليات الرديئة 32 و 64 بت (أعتقد أن هذا يسمى دعم متعدد القوس).

ليس كذلك مع gdbserver:لا يدعم تصحيح الأخطاء متعدد القوس.

أنت بحاجة إلى gdbserver الذي يطابق البنية المستهدفة، و gdb يطابق gdbserver.قم بإنشائها من المصدر، وقم بتكوينها باستخدام --target=i686.

ربما تكون قد قمت بالفعل بالتحقق من ذلك، ولكن إليك ما يلي:- على الجهاز 64 بت، هل لديك مكتبات 32 بت منه (libc، إلخ)؟- هل حاولت تشغيل gdb باستخدام المفتاح "-nx" (بدون ملفات تهيئة)؟

1) أنت بحاجة إلى gdbserver مناسب لجهازك المستهدف وجهازك المضيف (الجهاز الذي يناسب الجهاز المستهدف في حالتك.

لنفترض أنني أريد تصحيح هدف PPC من مضيف x86:

سأحتاج على هدفي إلى gdbserver قابل للتنفيذ.

سأحتاج على مضيفي إلى x86 gdb القابل للتنفيذ لـ powerpc.

بعد ضبط هذه الأشياء، عليك القيام بما يلي من مضيفك gdb قبل الاتصال بالهدف في حالة استخدام libs المشتركة:

تعيين بادئة solib-absolute-$ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE

دير $ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE

وإلا فإن المضيف gdb سوف يصاب بالجنون أثناء محاولته تحميل libs المشتركة لـ x86.

أعتقد أنك بحاجة إلى تشغيل gdb على جهازك المضيف بنسخة من البرنامج المستهدف.أي.اذا ركضت gdbserver myprog على الجهاز المستهدف الخاص بك، تحتاج إلى نسخ myprog إلى الجهاز المضيف وتشغيله gdb myprog.

بهذه الطريقة، سيقوم gdb الموجود على الجهاز المضيف تلقائيًا بالتقاط البنية من الملف القابل للتنفيذ.سيؤدي تشغيل gdb على المضيف بهذه الطريقة أيضًا إلى تحميل الرموز، والتي بدونها ستحصل على رموز لم يتم حلها (علامات الاستفهام).

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