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]
ありがとう!
はい、動作します(上記のgdbログのコメントを参照してください)。しかし、 "ステップオーバー"ではなく "ステップイン"としての作品です。私はgdbを66行目と同じ方法で「待つ」手順を踏み出すことを望みます。私はEclipseでgdbを使うつもりです。これは私にとって非常に迷惑な効果です。 – Romario
なぜ 'asmの部分のデバッグコード'が正しくない可能性がありますか?たぶん、gdbやgccの "マジック"互換性の引数がありますか? – Romario
gccのバグだと思います。デバッグ情報は回線と同期しません。あなたは矮星を強制しようとするかもしれない –