私はDDD/GDBを使用して、 "arm-eabi-gcc(devkitARM release 32)4.5.1"で構築されたNintendoDSで実行されている自家製ゲームをデバッグしています。 下記の手順の一部を再現したい場合は、the unstripped .elf binary hereをアップロードしました。GDBが行番号を見つけられない、objdumpが
gdbに、GameScript.o(GobExpression :: eval)にある機能の1つのリストを尋ねます。
私は同じGameScript.oの中で、SimpleGob :: playのリストをgdbに尋ねますが、 "SimpleGob :: playのために知られている行番号はありません"という文句を言います。 (ARM-EABI-GDBセッションだけ:)
下アーム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.
しかし、私が呼び出す場合アーム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>
ファイルが.aのアーカイブに詰め、これデバッグシンボル有効にして、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
してコンパイルし、最後にリンクされている:彼らはダンプに記載されているとして、それは明らかに、いくつかの行番号を見つけるのですかプログラムと一緒に。 -O0を使って再コンパイルすることは役に立たないようです。
GDB can not find line numbersの回避策を見てきましたが、add-symbol-fileを使用することを示唆していますが、どのシンボルファイルを追加するか分かりません... GDBデバッグシンボルそれはGDBが行番号で注釈を付けることができるように私のプログラムの何が欠けているのかを説明するでしょうか?
GameObject.cppにGameObject.cppが含まれています(問題がある場合)。リンク時に生成された.mapファイルは、SimpleGob :: playとGobExpression :: evalの両方がGameScript.oにあることを確認しますが、 'gdb'をだますべきではありませんか? – PypeBros
チャンスごとの関数は "インライン"として定義されていますか? –
@ sessyargc.jp:いくつかのインラインメソッドを呼び出すが、それらはそれ自身ではない。 SimpleGob :: playも仮想メソッドであり、そのように呼び出されます。 – PypeBros