Gcc Gdb在调试ARM7微控制器的汇编程序时跳过源代码行

Gcc Gdb在调试ARM7微控制器的汇编程序时跳过源代码行,gcc,assembly,gdb,arm,Gcc,Assembly,Gdb,Arm,我在调试用汇编语言为ARM7微控制器(AT91SAM7S64)编写的简单程序时遇到问题。我使用gcc、gdb和OpenOCD。 我的程序已正确加载到目标,工作正常(led闪烁)。但当我调用“next”命令时,gdb跳过了某些源代码行 以下是一段源代码: Reset_Handler: LDR R0, =0x0100 LDR R1, =PIOA_PER STR R0, [

我在调试用汇编语言为ARM7微控制器(AT91SAM7S64)编写的简单程序时遇到问题。我使用gcc、gdb和OpenOCD。 我的程序已正确加载到目标,工作正常(led闪烁)。但当我调用“next”命令时,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”而不是真实目标,但结果完全相同

(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)
我的生成文件:

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 $@

main.o : main.s
    @echo Compiling $<
    $(AS) -c $(ASFLAGS) $< -o $@
TRGT=arm none eabi-
CC=$(TRGT)gcc
CP=$(TRGT)对象复制
AS=$(TRGT)带cpp的gcc-x汇编程序
#AS=$(TRGT)AS
LD=$(TRGT)LD
OBJDUMP=$(TRGT)OBJDUMP
LD_SCRIPT=main.LD
MCU=arm7tdmi
#调试=插入
调试=dwarf-2
ASFLAGS=-mcpu=$(MCU)-g$(调试)
LDFLAGS=-T$(LD_脚本)
全部:main.elf main.lss
@回音完毕!
main.elf:main.o
@回音链接$<
$(CC)-nostartfiles$(LDFLAGS)$<-o$@
梅因:梅因
@回声编译$<
$(AS)-c$(ASFLAGS)$<-o$@
提前感谢您的帮助

在有问题的代码段中尝试使用“si”而不是n

“n”或多或少是下一条语句,“si”是下一条asm指令


如果asm片段的调试代码不正确,“si”可能仍然允许您单步执行它,利用在本例中的“语句”和“汇编程序”这一事实级别相同。

使用
ni
而不是
next
si
而不是通过汇编程序指令执行
step

我知道这有点旧,但您应该尝试向编译器添加
-O0
标志。我阻止gcc进行任何优化,这可能会导致您遇到的问题。

是的,它可以工作(请参阅上面gdb日志中的我的评论)。但is的作用是“跨入”而不是“跨过”。我希望gdb能像在第66行那样跳过“等待”过程。我计划在Eclipse中使用gdb,这对我来说是非常恼人的效果。为什么“针对asm的调试代码”可能不正确?也许gdb或gcc有什么“神奇”的兼容性争论?我猜gcc中有bug。调试信息不与行同步。也许你可以试着强迫侏儒
(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)