[英]GDB doesn't find line numbers, objdump does
I'm using DDD/GDB to debug a homebrew game running on NintendoDS, built with "arm-eabi-gcc (devkitARM release 32) 4.5.1".我正在使用 DDD/GDB 调试在 NintendoDS 上运行的自制游戏,该游戏使用“arm-eabi-gcc(devkitARM 版本 32)4.5.1”构建。 FYI, I uploaded the unstripped .elf binary (file no longer hosted), in case anybody wants to reproduce some of the steps below.
仅供参考,我上传了未剥离的 .elf 二进制文件(文件不再托管),以防有人想重现以下某些步骤。
I ask gdb for a listing of one of the functions sitting in GameScript.o (GobExpression::eval) it handles it fine.我要求 gdb 列出 GameScript.o (GobExpression::eval) 中的一个函数,它可以很好地处理它。
I ask gdb for a listing of SimpleGob::play, in the same GameScript.o, it complains that "No line number known for SimpleGob::play".我向 gdb 询问 SimpleGob::play 的列表,在同一个 GameScript.o 中,它抱怨“SimpleGob::play 没有已知的行号”。 (arm-eabi-gdb session just below:)
(arm-eabi-gdb 会话就在下面:)
arm-eabi-gdb AppleAssault.elf 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.
However, if I invoke arm-eabi-objdump -drl AppleAssault.elf, it obviously do find some line numbers, as they are mentioned in the dump:但是,如果我调用 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>
File is compiled with 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
, thus with debugging symbols enabled, packed in a .a archive, and finally linked with the program.文件使用
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 存档中,最后与程序链接。 Recompiling with -O0 doesn't seem to help.使用 -O0 重新编译似乎没有帮助。
I've seen a workaround at GDB can not find line numbers that suggests to use add-symbol-file, although I don't quite know which symbol file I'd add ... Am I missing a subtle key concept of GDB debugging symbols that would explain what (some part of) my programs are missing for GDB to be able to annotate it with line numbers ?我在GDB 上看到了一个解决方法找不到建议使用添加符号文件的行号,虽然我不太知道我要添加哪个符号文件......我是否错过了 GDB 调试的一个微妙的关键概念可以解释我的程序缺少什么(某些部分)的符号,以便 GDB 能够用行号对其进行注释?
使用g++
编译时尝试-gstabs+
以尝试使用 GNU 扩展调试信息(仅由gdb
理解)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.