c++ - GDB 找不到行号,objdump 找到了

标签 c++ debugging gdb arm gnu-toolchain

我正在使用 DDD/GDB 调试在 NintendoDS 上运行的自制游戏,该游戏使用“arm-eabi-gcc(devkitARM 版本 32)4.5.1”构建。 仅供引用,我上传了未剥离的 .elf 二进制文件(文件不再托管),以防有人想重现下面的某些步骤。

  • 我向 gdb 询问 GameScript.o (GobExpression::eval) 中的一个函数列表,它处理得很好。

  • 我向 gdb 询问 SimpleGob::play 的列表,在同一个 GameScript.o 中,它提示“没有已知的 SimpleGob::play 行号”。 (下面是 arm-eabi-gdb session :)

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.

但是,如果我调用 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 {包括剥离的路径} -DARM9 -fno-rtti -Wall -O2 -c/beetle/hobby/DS/dsgametools/branches/companim/libgeds/source/GameObject.cpp -o GameObject.o,因此启用了调试符号,打包在 .a 存档中,最后与程序链接。使用 -O0 重新编译似乎没有帮助。

我在 GDB can not find line numbers 看到了解决方法这建议使用添加符号文件,虽然我不太清楚我要添加哪个符号文件......我是否错过了 GDB 调试符号的一个微妙的关键概念,它可以解释我的程序的(某些部分)是什么缺少 GDB 能够用行号注释它吗?

最佳答案

在使用 g++ 编译时尝试使用 -gstabs+ 来尝试使用 GNU 扩展调试信息(只有 gdb 可以理解)。

关于c++ - GDB 找不到行号,objdump 找到了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8971958/

相关文章:

c++ - <优化出来> 在 ubuntu 中的 gdb

C++ - Brent-Pollard rho 算法无限循环

c# - 确定 AccessViolationException DragDrop.DoDragDrop 的原因

c++ - gdb - 如何查看指针数组的内容?

c - Linux ps命令核心随机

c - 段错误无效内存 0x0

c++ - C/C++ argv 内存管理

c++ - mmap 是否返回对齐的指针值

c++ - 是否可以更改不受您控制的 dll 的默认线程堆栈大小 c++ win32

debugging - Erlang "system"内存部分不断增长