ARM7 마이크로 컨트롤러 (AT91SAM7S64) 용 어셈블러 언어로 작성된 간단한 프로그램을 디버깅하는 데 문제가 있습니다. gcc, gdb 및 OpenOCD를 사용합니다. 내 프로그램이 제대로 표적으로로드되고 잘 작동합니다 (LED가 깜박입니다). 하지만 gdb는 'next'명령을 호출 할 때 특정 소스 코드 라인을 건너 뜁니다. 여기 Gdb가 ARM7 마이크로 컨트롤러 용 어셈블러 프로그램을 디버깅하는 동안 소스 코드 라인을 건너 뜁니다.
소스 코드의 단편이다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 타겟팅"을 사용했지만 rusults는 exaclty 동일하다.
(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 [email protected]
main.o : main.s
@echo Compiling $<
$(AS) -c $(ASFLAGS) $< -o [email protected]
감사합니다!
예, 작동합니다 (위의 gdb 로그에있는 내 의견 참조). 그러나 작품은 "발걸음"대신 "발걸음"으로 간주됩니다. gdb가 66 단계에서와 같은 방식으로 'wait'프로 시저를 넘겨주고 싶습니다. Eclipse에서 gdb를 사용할 계획이며 이것은 나에게 매우 성가신 효과입니다. – Romario
왜 'asm 조각을위한 디버그 코드'가 정확하지 않을 수 있습니까? 어쩌면 gdb 나 gcc에 대한 "마법"호환성 인수가있을 수 있습니까? – Romario
gcc의 버그 겠지요. 디버그 정보가 회선과 동기화되지 않습니다. 드워프를 강요하려고 할 수 있습니다. –