2012-01-23 3 views
4

입니다. DDD/GDB를 사용하여 "arm-eabi-gcc (devkitARM release 32) 4.5.1"로 빌드 된 NintendoDS에서 실행되는 자작 게임을 디버깅하고 있습니다. FYI, 누군가 아래의 일부 단계를 재현하려는 경우에 대비하여 the unstripped .elf binary here을 업로드했습니다.GDB에서 행 번호를 찾지 못했습니다. objdump가

  • Gdb는 GameScript.o (GobExpression :: eval)에있는 함수 중 하나의 목록을 잘 처리하도록 요청합니다.

  • 동일한 GameScript.o에서 gdb에게 SimpleGob :: play의 목록을 요청하면 "SimpleGob :: play로 알려진 행 번호가 없습니다."라는 메시지가 표시됩니다. 단지 :

아래 (팔 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에서 해결 방법을 보았습니다. 추가 할 기호 파일을 모르지만 ... 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

관련 문제