gpt4 book ai didi

gcc - Gdb 在调试 ARM7 微 Controller 的汇编程序时跳过源代码行

转载 作者:行者123 更新时间:2023-12-04 13:51:48 24 4
gpt4 key购买 nike

我在调试用汇编语言为 ARM7 微 Controller (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 输出(见下文),我使用了“target sim”而不是真正的目标,但 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

我的制作文件:
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 $@

在此先感谢您的帮助!

最佳答案

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

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

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

关于gcc - Gdb 在调试 ARM7 微 Controller 的汇编程序时跳过源代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4308354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com