سؤال

أنا أستخدم DDD/GDB لتصحيح أخطاء لعبة البيرة المنزلية التي تعمل على NintendoDS، والتي تم إنشاؤها باستخدام "arm-eabi-gcc (إصدار devkitARM 32) 4.5.1".لمعلوماتك، لقد قمت بالتحميل الثنائي .elf غير المجرد هنا, ، في حالة رغبة أي شخص في إعادة إنتاج بعض الخطوات أدناه.

  • أطلب من gdb قائمة بإحدى الوظائف الموجودة في GameScript.o (GobExpression::eval) فهو يتعامل معها بشكل جيد.

  • أطلب من gdb قائمة SimpleGob::play، في نفس GameScript.o، فهو يشكو من أنه "لا يوجد رقم سطر معروف لـ SimpleGob::play".(جلسة الذراع-eabi-gdb أدناه :)

الذراع-eabi-gdb AppleAssault.elf

GNU gdb (GDB) 7.2
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-eabi".
Reading symbols from AppleAssault.elf...done.
(gdb) list GobExpression::eval
342    bool eval(s16 data[REGISTERS], iGun **extra=0) {
343         GobCollision gc[2]={{0,0,data},{0,0,0}};
344         return eval(gc,extra);
345       }
346     
347       bool eval(GobCollision* c, iGun **extra=0) {
348         s16 *data=c[0].data;
349         s16 stack[STACKSIZE]; int sp=0;
350         u8 op;
351         if (!code) return true;
gdb) list SimpleGob::play
play    play()  
(gdb) list SimpleGob::play
No line number known for SimpleGob::play.

ومع ذلك، إذا قمت باستدعاء Arm-eabi-objdump -drl AppleAssault.elf، فمن الواضح أنه يعثر على بعض أرقام الأسطر، كما هو مذكور في ملف التفريغ:

0203c7f8 <_ZN9SimpleGob4playEv>:
_ZN9SimpleGob4playEv():
/beetle/hobby/DS/dsgametools/branches/companim/libgeds/source/GameObject.cpp:1710
 203c7f8:       b5f0            push    {r4, r5, r6, r7, lr}
 203c7fa:       465f            mov     r7, fp
 203c7fc:       4656            mov     r6, sl
 203c7fe:       464d            mov     r5, r9
 203c800:       4644            mov     r4, r8
 203c802:       b4f0            push    {r4, r5, r6, r7}
 203c804:       b0a7            sub     sp, #156        ; 0x9c
_ZN9CommonGob11gobDoChecksEv():
/beetle/hobby/DS/dsgametools/branches/companim/libgeds/source/GameObject.cpp:1430
 203c806:       7c03            ldrb    r3, [r0, #16]
_ZN9SimpleGob4playEv():
/beetle/hobby/DS/dsgametools/branches/companim/libgeds/source/GameObject.cpp:1710
 203c808:       1c05            adds    r5, r0, #0
_ZN9CommonGob11gobDoChecksEv():
/beetle/hobby/DS/dsgametools/branches/companim/libgeds/source/GameObject.cpp:1430
 203c80a:       2b00            cmp     r3, #0
 203c80c:       d100            bne.n   203c810 <_ZN9SimpleGob4playEv+0x18>
 203c80e:       e099            b.n     203c944 <_ZN9SimpleGob4playEv+0x14c>

يتم تجميع الملف مع arm-eabi-g++ -MMD -MP -MF /beetle/hobby/DS/dsgametools/branches/companim/libgeds/build/GameObject.d -g -march=armv5te -mtune=arm946e-s -fomit-frame-pointer -ffast-math -mthumb -mthumb-interwork {include path stripped} -DARM9 -fno-rtti -Wall -O2 -c /beetle/hobby/DS/dsgametools/branches/companim/libgeds/source/GameObject.cpp -o GameObject.o, ، وبالتالي مع تمكين رموز التصحيح، ومعبأة في أرشيف .a، وربطها أخيرًا بالبرنامج.يبدو أن إعادة الترجمة باستخدام -O0 لا تساعد.

لقد رأيت الحل البديل في لا يمكن لـ GDB العثور على أرقام الأسطر يقترح استخدام ملف رمز الإضافة، على الرغم من أنني لا أعرف تمامًا ملف الرمز الذي سأضيفه ...هل أفتقد مفهومًا رئيسيًا دقيقًا لرموز تصحيح أخطاء GDB التي من شأنها أن تشرح ما (جزء من) برامجي المفقودة حتى يتمكن GDB من التعليق عليها بأرقام الأسطر؟

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

المحلول

يحاول -gstabs+ عند التجميع مع g++ لمحاولة استخدام معلومات تصحيح أخطاء ملحقات GNU (لا يفهمها إلا gdb).

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