2010-11-29 5 views
4

ARM7マイクロコントローラ(AT91SAM7S64)のアセンブラ言語で記述された簡単なプログラムのデバッグに問題があります。私はgcc、gdb、OpenOCDを使います。 私のプログラムは正しくターゲットにロードされ、正常に動作します(LEDが点滅します)。しかし、gdbは、「次の」コマンドを呼び出すと特定のソースコード行をスキップします。ここでARM7マイクロコントローラ用のアセンブラプログラムのデバッグ中にGdbがソースコード行をスキップする

は、ソースコードの断片である:(下記参照)

Reset_Handler: 

       LDR  R0, =0x0100 
       LDR  R1, =PIOA_PER 
       STR  R0, [R1] 

       LDR  R1, =PIOA_OER 
       STR  R0, [R1] 
uuu: 
       bl  wait; 
       LDR  R1, =PIOA_SODR 
       STR  R0, [R1] 
uuu1: 
       bl  wait; 
       LDR  R2, =PIOA_CODR 
       STR  R0, [R2] 
       b  uuu; 
@ one second delay 
wait: 
    ............. 
    ............. 

     .end 

gdbの出力を得るために私の代わりに実際のターゲットの「SIMをターゲット」を使用しましたが、exaclty同じrusultsです。

(gdb) target sim 
Connected to the simulator. 
(gdb) load 
Loading section .text, size 0xc8 vma 0x100000 
Start address 0x100000 
Transfer rate: 1600 bits in <1 sec. 
(gdb) b Reset_Handler 
Breakpoint 1 at 0x100064: file main.s, line 59. 
(gdb) run 
Starting program: C:\Arm\Projects\Asm/./main.elf 

Breakpoint 1, Reset_Handler() at main.s:60 
60          LDR    R1, =PIOA_PER 
(gdb) n 
61          STR    R0, [R1] 
(gdb) n 
63          LDR    R1, =PIOA_OER 
(gdb) n 
64          STR    R0, [R1] 
(gdb) n 
uuu() at main.s:66 
66          bl    wait; 
(gdb) n 
67          LDR    R1, =PIOA_SODR 
(gdb) n 
68          STR    R0, [R1] 
(gdb) n  <<<<<--------- Here the problem begins 
67          LDR    R1, =PIOA_SODR 
(gdb) n 
68          STR    R0, [R1] 
(gdb) n 
67          LDR    R1, =PIOA_SODR 
(gdb) n 
68          STR    R0, [R1] 
(gdb) stepi <<<<<------ Doing a 'stepi' command allows to pass below 'uuu1' label 
uuu1() at main.s:70 
70          bl    wait; 
(gdb) n 
71          LDR    R2, =PIOA_CODR 
(gdb) n 
72          STR    R0, [R2] 
(gdb) n 
73          b    uuu; 
(gdb) n  <<<<<--------- Here the problem begins again 
71          LDR    R2, =PIOA_CODR 
(gdb) n 
72          STR    R0, [R2] 
(gdb) n 
73          b    uuu; 
(gdb) n 
71          LDR    R2, =PIOA_CODR 
(gdb) where 
#0 uuu1() at main.s:71 
#1 0x00100084 in uuu1() at main.s:70 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 
(gdb) 

gdbが 'uuu1'を別の機能と仮定して何らかの理由でスキップしているようです。私は 'uuu1'ラベルを削除する場合、問題は消えます。このラベルはどこにも使われていませんが、gdbの動作は非常に奇妙に見えます。私は長い間、どんな解決策を見出そうとしてきましたが、重要な結果はあります。 gccオプション '-fomit-frame-pointer'を使用しても役に立ちませんでした。 私はそれについて何ができますか? GDBとgccの

バージョン:

arm-none-eabi-gdb --version 
GNU gdb (GDB) 7.1 
.......... 
This GDB was configured as "--host=i686-pc-mingw32 --target=arm-none-eabi". 

arm-none-eabi-gcc --version 
arm-none-eabi-gcc (GCC) 4.5.1 

私のMakefileは:任意の助けを事前に

TRGT = arm-none-eabi- 
CC = $(TRGT)gcc 
CP = $(TRGT)objcopy 
AS = $(TRGT)gcc -x assembler-with-cpp 
#AS = $(TRGT)as 
LD = $(TRGT)ld 
OBJDUMP = $(TRGT)objdump 
LD_SCRIPT = main.ld 
MCU  = arm7tdmi 

#DEBUG = stabs 
DEBUG = dwarf-2 
ASFLAGS = -mcpu=$(MCU) -g$(DEBUG) 
LDFLAGS = -T $(LD_SCRIPT) 

all: main.elf main.lss 
    @echo Done! 

main.elf : main.o 
    @echo Linking $< 
    $(CC) -nostartfiles $(LDFLAGS) $< -o [email protected] 

main.o : main.s 
    @echo Compiling $< 
    $(AS) -c $(ASFLAGS) $< -o [email protected] 

ありがとう!

答えて

1

問題コードでnの代わりに "si"を使用してみます。

「n」は、多かれ少なかれ、次の文は、「SI」であり、次のasm命令です。

asmのデバッグコードが正しくない場合、 "si"はこの場合 "statement"と "assembler"レベルが同じであるという事実を利用して、これをステップすることができます。

+0

はい、動作します(上記のgdbログのコメントを参照してください)。しかし、 "ステップオーバー"ではなく "ステップイン"としての作品です。私はgdbを66行目と同じ方法で「待つ」手順を踏み出すことを望みます。私はEclipseでgdbを使うつもりです。これは私にとって非常に迷惑な効果です。 – Romario

+0

なぜ 'asmの部分のデバッグコード'が正しくない可能性がありますか?たぶん、gdbやgccの "マジック"互換性の引数がありますか? – Romario

+0

gccのバグだと思います。デバッグ情報は回線と同期しません。あなたは矮星を強制しようとするかもしれない –

0

stepではなく、nextおよびsiの代わりにniを使用してください。

0

私は、これは少し古いですけど、あなたはコンパイラに-O0フラグを追加してみてください。私はあなたが持っているもののような問題につながる任意の最適化を行うのgccを防ぎます。

関連する問題