GDB non trova numeri di linea, Objdump lo fa
-
12-11-2019 - |
Domanda
Sto usando DDD / GDB per eseguire il debug di un gioco homebrew in esecuzione su Nintendods, costruito con "ARM-EABI-GCC (Devkitarm Release 32) 4.5.1". Fyi, ho caricato il binario. >, nel caso qualcuno vuole riprodurre alcuni dei passaggi sottostanti.
- .
-
Chiedo GDB per un elenco di una delle funzioni seduti in GameScript.O (GoBExpression :: Eval) Gestiscela bene.
-
Chiedo GDB per un elenco di SimpleGob :: Play, nello stesso giocoscript.o, si lamenta che "Nessun numero di linea noto per SimpleGob :: Play". (Sessione ARM-EABI-GDB appena sotto :)
braccio-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.
Tuttavia, se invoco ARM-EABI-OBJDUMP -DL Appleasssault.fl, ovviamente troviamo alcuni numeri di linea, poiché sono menzionati nella discarica:
.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>
Il file è compilato con
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
, quindi con i simboli di debug abilitati, imballati in un archivio .a, e infine collegato con il programma. La ricompilazione con -o0 non sembra aiutare.Ho visto una soluzione alternativa a GDB non può trovare numeri di linea che suggerisce di utilizzare il file-symbol di aggiunta, anche se non conosco il modo in cui il file di simboli aggiungerei ... Mi manca un concetto chiave sottile di simboli di debug di GDB che spiegherebbero cosa (qualche parte di) i miei programmi sono Mancante per GDB per essere in grado di annotarlo con numeri di linea?
Soluzione
Prova -gstabs+
durante la compilazione con g++
per provare con le informazioni di debug di estensioni GNU (comprese solo da gdb
).