GDB ne trouve pas les numéros de ligne, objdump fait
-
12-11-2019 - |
Question
J'utilise DDD / GDB pour déboguer un jeu Homebrew fonctionnant sur Nintendodds, construit avec "ARM-EABI-GCC (Devkitarm Release 32) 4.5.1". FYI, j'ai téléchargé le binaire sans dépression ici, au cas où quelqu'un voulait reproduire certaines des étapes ci-dessous.
Je demande à GDB une liste de l'une des fonctions assis dans GamesScript.o (gobexpression :: eval) Il le gère bien.
Je demande à GDB une liste de SimpleGob :: Play, dans le même jeu Gamescript.o, il se plaint que "aucun numéro de ligne connu pour SimpleGob :: Play". (Session ARM-EABI-GDB juste en dessous :)
ARM-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.
Cependant, si j'invoque Arm-eabi-Objdump -Drl Appleassault.elf, il trouve évidemment certains numéros de ligne, comme ils sont mentionnés dans le dépotoir:
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>
Le fichier est compilé avec 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
, ainsi avec des symboles de débogage activés, emballé dans une archive .A et finalement lié au programme. Recompiler avec -O0 ne semble pas aider.
J'ai vu une solution de contournement GDB ne peut pas trouver de numéros de ligne Cela suggère d'utiliser un fichier add-symbol, bien que je ne sache pas trop quel fichier de symboles j'ajouterais ... est-ce que je manque un concept clé subtil de symboles de débogage GDB qui expliqueraient ce que (une partie de) mes programmes sont manquant pour GDB pour pouvoir l'annoter avec des numéros de ligne?
La solution
Essayer -gstabs+
Lors de la compilation avec g++
pour essayer avec des informations de débogage d'extensions de GNU (ne comprise que par gdb
).