[Trace32] Trace32 기본 내용 정리
소개
Trace32는 강력한 디버깅 툴 입니다.
별도의 라이센스가 필요하며, debug interface (대부분 JTAG ) 단자와 연결하여 사용합니다.
개인 기록용 포스팅이며, 가장 간단한 명령어들을 정리했고,
관련 페이지Trace32-base에서 지속적으로 업데이트 예정입니다.
시작
Trace32 (약어: T32) 를 사용하기 위해, 디버깅 s/w 를 먼저 설치해야 한다.
그러나 라이센스가 매우 고가이기 때문에, 일반적인 환경에서 구성은 어렵다.
기본적인 s/w와 라이센스가 준비되어 있다고 가정하고 진행합니다.
장치 연결
타겟 보드와 T32를 연결합니다.
디버거와 타겟보드를 보호하기 위해 타겟 보드는 전원이 off 상태인지 확인합니다.
debug interface (보통 JTAG)에 1번 핀을 잘 확인하고 연결합니다.
파워 디버거 interface를 통해 디버거의 상태를 확인할 수 있습니다.
' POWER
' SELECT
' EMULATE
POWER : 전원을 켜면 켜집니다.
SELECT : 전원을 켜면 점멸, PowerView 실행 시 on상태 유지.
EMULATE : 타겟 러닝 시 켜집니다.
t32m[core].exe 실행하거나, t32start.exe 을 실행하여 Core를 선택하여 시작할 수 있습니다.
PowerView
Opt 1. 먼저 디버깅할 타겟에 대한 정보를 설정합니다.
[CPU] -> [System Setting] -> … 필요에 맞게 JTAG 클럭, 멀티코어/기타 설정을 마치고 Mode에서 UP을 선택합니다.
Opt 2. 타겟 보드에 대한 스크립트 파일을 사전에 작성하고,
[File] -> [Edit script] 메뉴를 통해 .cmm 스크립트를 불러옵니다.
Do 혹은 Debug -> over 으로 실행합니다.
Opt 3. Watchdog(혹은 비슷한 모듈)이 지원되는 환경(e.g. linux kernel)에서 T32를 사용할 때 주의해야 합니다.
T32에 의해 Break된 경우, 장치가 벽돌이 되는 것을 방지하기 위해 자동으로 장치를 Reset 합니다.
그렇게 되면 T32와의 연결도 끊어지게 됩니다.
데이터 시트를 참조하여 WDT를 disable하거나, 리눅스 커널의 경우, 관련 CONFIG를 제거하여
빌드 후에 사용합니다.
추가로, 멀티코어 환경에서는 서로 다른 Core끼리의 IDLE 상태를 감시하는 매커니즘이 있을 수도 있습니다.
이 경우에는 CPU설정을 MPCore 환경으로 세팅하고 각 코어에 대한 정보를 T32 스크립트에 포함하여 연결합니다.
명령어
명령어 입력 프롬프트(B::)에 원하는 명령을 입력할 수 있습니다.
대소문자를 구분하지 않으며, 소프트웨어 버전마다 명령어가 다를 수 있습니다.
명령어가 다를 경우, Tab 키의 자동완성 기능으로 적절한 명령어로 대체 하면 됩니다.
basic
initialize
B:: sys.d
B:: reset
go
B:: g
running 상태가 됩니다. 이 때는, 레지스터 dump가 되지 않습니다.
break
B:: b
break 상태가 됩니다. 이 상태에서 내가 원하는 레지스터 값을 확인할 수 있습니다.
data dump
B:: d.dump a:{physical_addr} /sl
특정 주소의 레지스터 값을 확인할 수 있는 명령어 입니다.
sl 옵션은 값이 변화함에 따라 색깔로 표시해 주는 옵션 입니다.
load elf
B:: d.load.elf {target_elf_path} /nocode
symbol을 로드하는 명령어 입니다.
target_elf_path 대신 ‘*’ 를 사용하여 직접 파일을 선택할 수 있습니다.
명령어 실행 후 PowerView에서 [View] -> [Symbol Table] … 통해서 볼 수 있습니다.
translate path
B:: y.sourcepath.translate "{before}" "{after}"
가져오는 파일이 종종 로컬에서 알 수 없는 경로일 수 있습니다.
로컬에서 이해할 수 있게, 경로 상의 before 텍스트를 after 텍스트로 변환한다.
CMM 스크립트
cmm 스크립트 작성 시 명령어는 다음과 같다.
B:: pedit main.cmm
혹은 기존에 작성한 스크립트를 사용하는 것은
B:: pedit *
몇가지 스크립트 예제 (필기용)
/* data dump */
data.dump R(PC) // data dump in PC addr
data.dump apb:0x... // access memory addr directly
data.dump ahb:0x... // access memory addr directly
data.dump a:0x... // access memory addr directly
data.dump a:0x... /quad // access memory addr directly
/* mmu */
mmu.list.pt R(x3) // check virtual_addr to physical_addr
mmu.dump.pt R(x3) // how to table walking
segmentation fault:
./elf_name
...
...
...> syncro exception
(almost permission) or page fault
segmentation fault -> exit
` break point
GUI:
Linux -> process -> Debug New Process
elf_name (main) break
-> load elf
CLI:
B:: symbol.browse.symbol
Filter: fault (__do_fault) select
(or Functions that must be called before panic)
view register: peripherals -> ID... (first)
(check esr)
B:: break.list
B:: frame.view
Use cmm script with arguments
-----------------------------
entry &core &arg2 &arg3
path + c:\ // "do" search pwd default, path +: add search path
if ("&core"=="CA65")
(
do tcn100x_ca65e.cmm
if (&arg2!="")
(
do tcn100x_ca65e.cmm &arg2
)
)
if ("&core"=="CM7")
(
do tcn100x_cm7.cmm &arg2
if (&arg3!="")
(
do tcn100x_cm7.cmm &arg3
)
)
ENDDO
-----------------------------
Add button on the toolbar
(B:: menu.reprogram toolbar.men)
-------------------------
ADD
TOOLBAR
(
TOOLITEM "setting CM7 core 0" "c0,B" "do main.cmm CM7 0"
SEPARATOR
TOOLITEM "setting CM7 core 0" "c1,B" "do main.cmm CM7 1"
SEPARATOR
TOOLITEM "setting CM7 core 0" "c2,B" "do main.cmm CM7 2"
SEPARATOR
TOOLITEM "setting CM7 core 0" "c3,B" "do main.cmm CM7 3"
SEPARATOR
)
-------------------------
system-settings.cmm for TOOLBAR
-------------------------------
B::
path + C:\
menu.reprogram c:\toolbar.men
ENDDO
-------------------------------
save C:\T32\system-settings.cmm
&
search <help>
how to edit & use system-settings.cmm
[Guide <help>]
help -> find
find: // view example
find index: // view defines
Leave a comment