首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gdb在调试ARM7单片机汇编程序时跳过源代码行

Gdb在调试ARM7单片机汇编程序时跳过源代码行
EN

Stack Overflow用户
提问于 2010-11-30 05:38:12
回答 3查看 2.4K关注 0票数 5

我在调试一个用ARM7微控制器(AT91SAM7S64)的汇编语言编写的简单程序时遇到了问题。我用的是gcc,gdb和OpenOCD。我的程序已正确加载到目标,并且工作正常(它会闪烁一个led)。但是当我调用'next‘命令时,gdb会跳过某些源代码行。

以下是一段源代码:

代码语言:javascript
复制
    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“而不是真正的target,但结果是完全相同的。

代码语言:javascript
复制
(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的版本:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 $@

提前感谢您的帮助!

EN

回答 3

Stack Overflow用户

发布于 2010-12-02 03:48:29

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

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

如果asm的调试代码不正确,"si“仍然允许您单步执行它,因为在本例中”语句“和”汇编“级别是相同的。

票数 2
EN

Stack Overflow用户

发布于 2011-05-25 06:38:47

通过汇编指令使用ni而不是nextsi而不是step

票数 0
EN

Stack Overflow用户

发布于 2015-06-16 20:48:43

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4308354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档