GDB no encuentra los números de línea, objdump hace
-
12-11-2019 - |
Pregunta
Estoy usando DDD / GDB para depurar un juego de Homebrew que se ejecuta en Nintendods, construido con "ARM-EABI-GCC (Devkitarm Lanzamiento 32) 4.5.1". FYI, subí a el binario no tirado aquí , en caso de que alguien quiera reproducir algunos de los pasos a continuación.
-
Le pregunto GDB para obtener una lista de una de las funciones sentadas en GamesScript.o (GOBEXPRESION :: EVAL) lo maneja bien.
-
Le pido a GDB para obtener una lista de SimpleGob :: Play, en el mismo Juegoscript.o, se queja de que "No se conoce el número de línea para SimpleGob :: Play". (Sesión ARM-EABI-GDB justo debajo :)
brazo-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.
Sin embargo, si invoco ARM-EABI-OBJDUMP -DRL APPLEASSAFT., obviamente, encuentra algunos números de línea, ya que se mencionan en el volcado:
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>
El archivo se compila 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
, por lo tanto, con símbolos de depuración habilitados, embalados en un archivo .a y finalmente vinculado con el programa. La recompilación con -O0 no parece ayudar.He visto una solución alternativa en GDB no puede encontrar números de línea Eso sugiere usar el archivo agregado de símbolos, aunque no sé del mismo que el archivo de símbolos agregaría ... estoy perdiendo un concepto clave sutil de símbolos de depuración GDB que explicaría qué (parte de) mis programas son ¿Falta para GDB para poder anotarlo con números de línea?
Solución
Intente -gstabs+
al compilar con g++
para probar con las extensiones de GNU información de depuración (solo entendida por gdb
).