TRACE32 라는 디버거에 대한 대략적인 소개와 함께, 직접 디버깅을 해볼 것이다.
TRACE32
전세계적으로 가장 많이 사용되어지고 있는 디버거 장비로서, 기존의 디버거들보다 좀더 폭넓은 기능들을 지원하고 있다.
개인적으로 가장 마음에 드는 것은 거의 모든 오브젝트 파일을 지원하기 때문에, VPOS 를 디버깅할 수 있다. REALVIEW 에 비하면 아주 강력하다고 생각한다. 참고로 여기서는 TRACE32 대신 T32 이라고 명명하겠다.
준비운동 하기
한장의 설치 CD 로 설치가 가능하다. 설치가 약간 혼동스럽다. 필자 역시 몇번의 설치 끝에 대충 감을 잡을 수 있었다.
순서는 다음과 같다.
- CD 를 넣고, SETUP.BAT 파일을 실행시킨다.
- 설치 도중에 Product Type 항목에서 설치할 항목을 지정할 수 있는데, 여기서는 ICD In-Circuit-Debugger 을 선택한다.
- 곧이어 ICD Interface Type 을 묻는데, USB 를 선택한다. 참고로 여기서는 우리는 호스트와 ICD 사이에 USB 를 통해서 연결할 것이다.
- 다음 단계에서 New Debugger 를 선택한다. 그리고 OS 를 선택한다. 마지막으로 사용할 아키텍처를 선택한다. 여기서는 ARM 시리즈를 선택한다.
- TRACE32 ICD 를 호스트와 USB 를 통해 연결하고, 전원을 넣는다. 이렇게 하는 이유는 곧이어, 디바이스 드라이버를 설치하기 때문이다.
- 아직 설치가 끝나지 않았다. 폰트는 Small Size Font 를 선택한다. 나머지는 기본(default)값으로 선택한다.
- 마지막으로 Register later 를 선택하고, 설치를 마친다.
앞의 Product Type 항목을 보고, 약간의 혼동이 생길지도 모르겠다. 필자의 경우, 시뮬레이터를 설치하려고 시도했지만, T32 의 경우에 ICD In-Circuit-Debugger 를 선택하면, 설정파일의 수정을 통해 시뮬레이터를 사용할 수 있다. 자세한 내용은 나중에 설명하도록 하겠다.
업데이트 하기
CD 를 통해 설치한 T32 의 버전이 낮기 때문에, 업데이트를 해줘야 한다.
크게 두가지 업데이트가 있다. 하나는 디버거 소프트웨어이고, 또하나는 ICE 장비의 펌웨어 업데이트이다.
먼저 디버거 소프트웨어의 업데이트 부터 살펴보자.
이때, 주의할 것이 있다. T32 의 경우, 업데이트를 할 때마다 비용을 지불해야 한다. 구입후 1년까지는 무상으로 해주지만,그 이후에는 비용을 지불해야 한다. 그래서 너무 최신버전으로 업데이트 할 경우, 실행시에 기간이 지났다는 메세지와 함께 시리얼 번호를 입력하라는 창이 뜰 수 있다. 그렇기 때문에, 필자가 적당한(?) 것으로 업데이트 해야 한다.
http://mdstec.com/main/bbs/list.php3?board=down_trace32_up 에서 업데이트 파일을 받을 수 있다.
업데이트 방법은 단순히 압축을 풀어서 C:\T32 아래에 덮어쓰기 하면 된다. 그리고 나서, 시스템을 재부팅 한다.
업데이트 후에 확인해 볼 것은 'CPU → System Settings..' 을 실행해서, 'CPU → S3C2410X' 가 있는지 확인한다. 존재한다면, 제대로 업데이트 된 것이다.
이번에는 ICE 장비의 펌웨어 업데이트를 살펴보자! 우선 먼저, 현재 펌웨어 버전부터 확인한다. 'Help → About TRACE32… → Hardware' 를 선택하면, 현재의 펌웨어 버전이 출력된다. 필자의 경우, v5.0 이었다. 앞의 MDS 사이트에서 최신 펌웨어를 다운로드 받는다. 참고로 2006년 9월 현재 최신버전은 v6.4 이다. 압축을 풀면,
- USBFLASH(ver6.4).BIN –» USBFLASH.BIN 으로 파일명 변경
- USBFLASH(ver6.4).CMM
파일이 나온다. 이 파일들을 적당한 위치에 복사하고, 'File → Run Batchfile…' 을 실행하고, USBFLASH(ver6.4).CMM 파일을 선택한다.
약간의 시간 후에, 밑에 창에 'Flash Updated' 라는 메세지가 보일 것이다. 제대로 업데이트가 되었는지 확인해보자!
v6.4 로 바뀌었다면 성공이다.
마지막으로 VPOS 를 가지고 디버깅을 해볼 것이기 때문에, VPOS 의 소스를 준비해둔다.
앞으로는 크게 시뮬레이터와 타겟보드 모드를 구분해서 설명할 것이다.
먼저 시뮬레이터를 이용한 디버깅부터 설명하도록 하겠다.
시뮬레이터 디버깅
앞에서 설치시에 ICD In-Circuit-Debugger 를 선택했기 때문에, 시뮬레이터를 사용하기 위해서는 설정파일을 수정해야 한다.
C:\T32\config.t32 파일을 다음과 같이 수정해야 한다.
... PBI=SIM ...
저장 후에, T32 를 다시 실행시켜 보자!
별다른 오류없이 실행되었다면, 이제 본격적으로 디버깅에 들어가보자!
처음에도 설명했듯이, T32 의 경우, 왠만한 오브젝트 파일들을 지원한다. 고로, GCC 로 컴파일한 ELF 포맷의 VPOS 역시 T32 를 통해서 실행시킬 수 있다.
또 한가지는, VPOS 의 경우에 크게 2 개의 오브젝트 파일(VPOS_bootloader-elf32, VPOS_kernel-elf32)로 구성되어 있다. bootloader 와 kernel 이 그것이다. 나중에 VPOS 커널을 디버깅하기 위해서는 bootloader 를 먼저 올리고 난 후에, kernel 을 올려야 한다.
T32 에서 C 소스 레벨로 디버깅을 하기위해서는 컴파일시에 '-g' 옵션을 넣어 주어야 한다. 그렇지 않으면, 어셈블러 레벨에서의 디버깅만 가능하다.
VPOS 의 Makefile 을 다음과 같이 수정한다.
CC = arm-linux-gcc OC = arm-linux-objcopy LD = arm-linux-ld INCLUDE = -I. -I$(TOPDIR)/include -I/home/kjm/Tools/Compiler_ARM9/lib/gcc-lib/arm-linux/2.95.3/include CFLAGS = -O0 -g -Wall -Wstrict-prototypes -fPIC -fomit-frame-pointer -mapcs-32 -mshort-load-bytes -msoft-float -nostdinc -no startfiles -nostdlib $(INCLUDE) ## -g 옵션 추가!! #CFLAGS = -O0 -g -Wall -fno-builtin -nostdinc -nostartfiles -nostdlib $(INCLUDE) #CFLAGS = -O0 -g -Wall -march=armv4 -mtune=strongarm1100 -mapcs-32 -nostdinc $(INCLUDE) #cFLAGS = -O2 -Wall -march=armv4 -mtune=strongarm1100 -fomit-frame-pointer -mapcs-32 -nostdinc $(INCLUDE) OCFLAGS = -O binary -R .note -R .comment -R .stab -R .stabstr -S
위와 같이 Makefile 을 수정해준 뒤에 다시 컴파일 한다.
#make clean #make
C 소스레벨에서 디버깅을 하기 위해서는 '-g' 옵션의 추가 외에도 한가지가 더 필요하다. 그것은 컴파일 경로를 맞춰주어야 하는 것이다.
같은 OS 에서 컴파일하고, T32 를 이용해서 디버깅을 한다면 아무런 문제가 없겠지만, 알다시피 VPOS 가 컴파일 되는 환경은 리눅스이고, T32 가 실행되는 환경은 윈도우이다. 그렇기 때문에, VPOS 가 컴파일 될때의 환경과 T32 에서 디버깅할 때의 환경이 다르면, C 소스 파일을 불러오지 못하고 결국 어셈블러 레벨에서의 디버깅만 할 수 밖에 없다. 환경을 맞춰주는 일은 간단하다.
예를 들어, 리눅스에서 VPOS 를 /home/wjkim/VPOS 라는 디렉토리 아래에서 'make' 를 이용해서 오브젝트 파일을 만들었다면, 윈도우에서는 가장 최상위 디렉토리(드라이버의 최상위 디렉토리) 밑에 home/wjkim/VPOS 라는 디렉토리를 동일하게 만들어줘야 한다.
OS | EXAMPLE |
리눅스 | /home/wjkim/VPOS |
윈도우 | C:\home\wjkim\VPOS |
어찌보면, 번거로운 일이다. 소스 코드가 수정되면, 다시 컴파일해야 하고, 소스파일과 오브젝트 파일을 윈도우로 복사해야 한다.
이제 본격적으로 디버깅을 하기위한 준비가 모두 끝났다.
T32 를 실행시킨다.
가장 먼저해야 할 것은 'CPU → System Settings…' 에서 아키텍처를 선택하는 것이다. 여기서는 smdk2410 보드의 'S3C2410' 을 선택한다.
그리고나서, 'Mode → Up' 으로 선택한다. 'File → Load…' 를 선택해서, 업로드 할 오브젝트 파일을 선택한다.
먼저 bootload 를 올리고, kernel 을 올린다.
이제 직접 디버깅을 해볼 차례다. 'View → List Source' 을 선택하면, 창이 하나 뜰 것이다.
가장 먼저 보이는 것은 어셈블러 코드이다. 현재 VPOS bootloader 가 어셈블러로 만들어져 있기 때문에 당연한 것이다.
bootloader 의 어셈코드에서 kernel 의 'VPOS_kernel_main()' 함수를 호출하는 곳에서 'Step' 을 눌렀을 때, hal_swi_handler.c 파일로 점프(jump) 하면서, C 소스 파일이 보인다면, 성공이다.
T32 cmm 파일
T32 에서는 일일이 반복되는 작업을 자동화할 수 있도록 스크립트 파일(.cmm)을 지원한다. 디버깅할 때마다, 앞에서 설명한 작업을 일일이 다시 해주는 것은 비효율적이다. 한번 .cmm 파일을 만들어 놓으면 한번의 .cmm 파일 수행만으로 자동으로 디버깅 환경을 만들 수 있다.
다음은 필자가 만든 vpos_sim.cmm 이라는 파일이다. 참고로 'File → Run Batchfile' 에서 실행할 수 있다.
sys.cpu arm920t sys.u D.LOAD C:\opt\vpos\images\vpos_bootloader-elf32 D.LOAD C:\opt\vpos\images\vpos_kernel-elf32 B:Data.List B:Register /SL
타겟 디버깅
이번에는 직접 타겟보드와 T32 를 연결해서 디버깅을 해보자!
시뮬레이터 디버깅과 다른점이 있다면, 그것은 마치 타겟보드가 동작하는 주소를 미리 알고 있어야 한다는 점이다.
VPOS 분석 - 1.초기화 를 참고하기 바란다. 여기서는 사전에 타겟보드에 부트로더와 커널(vpos.bin) 을 write 했다는 가정하에서 설명한다.
부트로더 디버깅
만일 부트로더를 디버깅하고 싶다면, 0x0 번지부터 보면 된다. 0x0 번지는 즉 Flash 영역이기 때문에 디버깅이 제한적이다(breakpoint 를 설정할 수 없음). Flash 영역에도 breakpoint 를 설정하기 위해서 명령어 창에 다음을 입력한다.
MAP.BONCHIP 0x0--0x7FFFFF
이 부분에서 앞에서의 시뮬레이터 디버깅에서 본 화면과 조금 다를 것이다.
그것은 바로 Flash 에 write 한 것이기 때문에 심볼 정보가 빠져있다. 심볼 정보를 추가하기 위해서는 명령어 창에
DATA.LOAD.ELF c:\opt\vpos\images\vpos_bootloader-elf32 /nocode
위와 같이 입력해주면 된다. elf 파일의 심볼 부분만 업로드 한다는 의미이다. 경로가 정확하다면, 디버깅 소스 창에 주석이 생겼을 것이다.
커널 디버깅
부트로더는 VPOS 커널을 메모리 주소 0x30000000 으로 복사하는 역할을 하고, PC 값을 0x30000000 으로 넘긴다.
그러므로 커널을 디버깅하고 싶다면, 당연히 0x30000000 번지부터 보면 된다. 역시 심볼 정보를 추가하기 위해서는
DATA.LOAD.ELF c:\opt\vpos\images\vpos_kernel-elf32 /nocode
위와 같이 입력하면 된다. 커널의 경우, 가장 처음에 HAL_arch_startup.S 의 어셈코드로 시작한다. C 코드 레벨의 시작을 보고 싶다면, 'View → Symbols → Browse' 를 선택해서 'VPOS_kernel_main()' 를 찾아 breakpoint 를 설정하면 된다.
커널이 수정 되었을 경우
앞에서는 vpos.bin(bootloader + kernel) 가 Flash 에 write 되었다는 가정하에 설명했다. 하지만 이 방법은 커널이 수정된다면, 매번 Flash 에 write 해야 하기 때문에 번거롭다. 컴파일 후에 나오는 elf 파일을 메모리에 바로 올려서 디버깅이 가능하다.
일반적으로 부트로더보다는 커널이 수정될 가능성이 높기 때문에 여기서는 커널쪽을 중점적으로 설명하겠다. 수정한 커널을 메모리 번지 0x30000000 에 'File → Load' 메뉴를 이용해서 로드하고, 또한 심볼 정보 또한 추가해주면 된다.
TRACE32 파워포인트 자료
다음의 주소에서 다운로드 받을 수 있다. elf.ppt
짤막한 사용 팁
매번 시뮬레이터를 사용하기 위해서 config.t32 파일을 수정해서 사용할 때마다 매번 수정하는 것은 여간 귀찮은 일이 아니다.
이런 수고를 덜기 위해서 2 개의 아이콘을 각각 만들어서 필요할 때, 골라서 실행할 수 있도록 한다.
먼저 sim.t32 이라는 파일을 보기로 하자!! 이파일은 시뮬레이터로 실행할 때 config.t32 대신 읽어들이는 파일이다.
; Environment variables OS= ID=T32 TMP=C:\WINDOWS\TEMP SYS=C:\T32 PBI=sim USB ; Printer settings PRINTER=WINDOWS ; Screen fonts SCREEN= FONT=SMALL
여기서 굳이 설명은 하지 않겠지만, config.t32 파일은 기본적으로 일반 타겟 보드 디버깅시에 읽어들일 파일이다.
이번에는 각 아이콘에 대한 설명이다.
Power View 실행 아이콘 대상(T) | C:\T32\T32MARM.EXE -c C:\T32\config.t32 |
시뮬레이터 실행 아이콘 대상(T) | C:\T32\t32marm.exe -c C:\T32\sim.t32 |
위의 두개의 아이콘을 생성했다면, 각각 실행시켜보자!!