لم يجد GDB أرقام الأسطر، لكن objdump يفعل ذلك
-
12-11-2019 - |
سؤال
أنا أستخدم 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
).