2012-01-23 26 views
4

私は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が行番号で注釈を付けることができるように私のプログラムの何が欠けているのかを説明するでしょうか?

+0

GameObject.cppにGameObject.cppが含まれています(問題がある場合)。リンク時に生成された.mapファイルは、SimpleGob :: playとGobExpression :: evalの両方がGameScript.oにあることを確認しますが、 'gdb'をだますべきではありませんか? – PypeBros

+0

チャンスごとの関数は "インライン"として定義されていますか? –

+0

@ sessyargc.jp:いくつかのインラインメソッドを呼び出すが、それらはそれ自身ではない。 SimpleGob :: playも仮想メソッドであり、そのように呼び出されます。 – PypeBros

答えて

3

g++でコンパイルすると、GNU拡張デバッグ情報(gdbのみ)を試してみると、-gstabs+を試してみてください。

+0

うわー。それだけで働いた。任意のチャンスhttp://stackoverflow.com/questions/8980566/gdb-reports-wrong-address-for-parameter-in-c-objects-constructorはあなたに影響を与えましたか? (今、私はちょうど理由を理解する必要があります:P) – PypeBros

関連する問題