Gcc Gdb在调试ARM7微控制器的汇编程序时跳过源代码行
我在调试用汇编语言为ARM7微控制器(AT91SAM7S64)编写的简单程序时遇到问题。我使用gcc、gdb和OpenOCD。 我的程序已正确加载到目标,工作正常(led闪烁)。但当我调用“next”命令时,gdb跳过了某些源代码行 以下是一段源代码: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, [
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)