Useful Function in TRACE32
목차
- 1 TRACE32 상황별 유용한 기능
- 1.1 sYmbol Browser(source tree) 에 대한 설명
- 1.2 cmm 작성 및 실행법(do and cd.do)
- 1.3 Built in device driver Init함수 하나씩 실행하고 Debugging
- 1.4 PowerView 윈도우를 text 파일로 저장하는 방법
- 1.5 break points 설정을 파일로 저장해 두고 다음에 사용하는 방법
- 1.6 watch window 설정을 파일로 저장해 두고 다음에 사용하는 방법
- 1.7 Lock-up 시 마지막 PC 값 확인하기
- 1.8 함수 수행 시간 알아내는 방법
- 1.9 각 정보(Ex. Register/ Data.Dump/ Var.Watch) 윈도우의 변동된 값 Highlight하기
- 1.10 Frame buffer 의 image 확인
- 1.11 TRACE32 maintenance
TRACE32 상황별 유용한 기능
sYmbol Browser(source tree) 에 대한 설명
현재 로드된 ELF 파일의 sYmbol들에 대한 구조 및 내용에 대한 정보를 가지고 있는 윈도우입니다. 아래 그림과 같이 단축 아이콘 중 Symbol버튼을 클릭하면 해당 윈도우를 열수 있습니다. 아래 표기된 Text box안의 \\*\*\*는 해당 윈도우가 보여주는 내용을 의미하며 Default로 현재 로드된 모든 sYmbol들을 보여주도록 설정되어 있습니다. 여기서 *표시는 모든 것을 의미합니다.
만약 String “rodu”를 포함하는 sYmbol들만을 보고자 한다면 아래와 같이 입력하면 해당 string을 포함하는 sYmbol들만 모두 보이게 되므로 원하는 sYmbol들만 Filtering하여 볼 수 있습니다.
다음은 상위 구조를 확인하기 위해 화살표 위방향버튼()을 클릭합니다. 그러면 모듈이름(module name) 별로 보여주며 아래 그림과 같이 “Source” 항목의 체크박스를 선택하면 모듈이름(module name)이 소스파일 이름으로 표기됩니다. 특정 소스 파일을 선택 후 더블클릭하면 그 소스파일의 하위구조를 보여 주게 되며 해당 파일에서 선언된 함수 및 변수 정보들을 보여주게 됩니다. 그 다음 그림은 “a2mp.c” 파일을 더블클릭했을 때 보여주는 정보입니다. 해당 소스파일 내에서 선언된 sYmbol들을 보여주는 것을 알 수 있습니다. 다시 위방향화살표를 눌러 원래 소스파일 구조를 보이는 단계로 올라온 후 다시 한번 버튼을 클릭하면 맨 상위 구조를 보여주게 되는데 현재 libdvm과 vmlinux라는 두개의 sYmbol 이미지가 로
드된 것을 볼 수 있습니다. 만약 두개의 sYmbol들 중 하나의 sYmbol들만 보고 싶다면 해당 이미지만 더블클릭하면 하위구조로 가게되며 선택된 이미지의 소스파일들만 보여주게 될 것입니다.
다음 그림은 위 윈도우에서 libdvm이미지를 더블클릭했을 때의 상태를 보여주고 있습니다. libdvm 이미지의 모든 sYmbol들(\\libdvm\*)을 보여주고 있는 것을 알 수 있습니다.
cmm 작성 및 실행법(do and cd.do)
Scirpt(.cmm)파일 작성 및 디버그 방법을 알아보고 작성한 cmm파일을 실행하는 밥법을 확인합니다.
cmm파일 작성 및 디버그 방법(plist/pmacro)
1) cmm 파일 만들어 Editing하기
cmm 파일 editor 실행 명령은 ”pedit”를 사용합니다. 명령 형식은 아래와 같고 만약 파일에 path가 기술되지 않으면 현재 작업 directory로부터 파일을 찾아 Editor를 열게 됩니다. 만약 파일이 없으면 만들어 열게 됩니다. 참고로 현재 작업 Directory의 확인은 TRACE32 Command line에서 “pwd”라는 명령을 통해 확인할 수 있습니다.
PEDIT [filename.cmm]
Ex) pedit C:\T32\test.cmm ; C:\T32\test.cmm파일과 함께 cmm file editor를 엽니다.
Ex) pedit test.cmm ; 현재 작업 dirctory로부터 test.cmm 파일을 cmm file editor로 엽니다.
일반 Editor와 Peditor의 차이점은 Script 파일을 수정하고 바로 실행하고 Debugging 할 수 있는 추가 기능을 아래와 같이 더 가지고 있는 것입니다.
만약 이미 파일이 만들어져 있다면 TRACE32 메뉴에서 File>>Edit Batch File... 을 클릭하면 File Browse box가 뜨는데 이를 이용하여 Editor를 열수도 있습니다.
2) 만든 실행파일 실행 및 debug하기
Script(cmm)파일도 만들다 보면 문법 error 또는 의도하지 않은 결과가 나올때가 있는데 이를 위해 TRACE32는 Script파일 Debugger를 제공하고 있습니다. 아래 그림과 같이 Peditor 윈도우에서 ”Debug” 버튼을 클릭하면 해당 Script의 Debug 윈도우를 띄울 수 있습니다.
디버그 윈도우를 띄우면 기본적인 Debug 기능을 하는 Step/Over/Continue(Run)/Stop(Break) 버튼들을 확인 할 수 있습니다. ”Enddo” 버튼은 현재 Debug 실행 중인 Script 파일의 검증을 종료하겠다는 기능을 갖습니다.
TRACE32 Comman Line에서 ”plist” 명령을 입력하면 현재 실행(debugging) 중인 Script의 Debug 윈도우를 열어 줍니다. 혹, 특정 Script를 실행하다 Error가 발생한 경우 그 위치를 알고자 한다면 간단히 ”plist” 명령을 실행하면 Error가 발생된 위치를 쉽게 확인할 수 있습니다. 실행 중 Error가 발생한 경우 Script 실행을 멈추기 때문입니다.
아래 그림은 Script를 실행하다 Error가 발생하여 실행을 멈춘 예를 보여주고 있습니다. TRACE32가 알지 못하는 명령 “!”에 의해 발생된 Error인 것을 확인할 수 있습니다.
Script Debug(“plist”) 윈도우에서 “Macro” 버튼은 Script 실행 중 Script 내의 Script 변수 값과 cmm call 관계를 보여주는 윈도우입니다. 따라서 Script의 Global/Local 변수들을 모두 확인할 수 있습니다.
Script Debugging 중 BreakPoint를 설정할 수 있으며 설정하고자 하는 Script 라인에 더블클릭하는 것으로 간단히 할 수 있습니다. 설정한 경우 “plist” 윈도우의 좌측에 밤색의 수직 바가 생성되어 BreakPoint가 설정되었음을 알려줍니다.
Script에서 여러 개의 BreakPoint 설정은 TRACE32 SW 버전 2013.10 이후부터 가능하며 “plist” 윈도우에서 “BreakPoints” 버튼을 클릭하는 것으로 현재 설정된 Script BreakPoint들에 대한 정보를 확인 할 수 있습니다.
cmm파일 실행명령(do/cd.do)
1) .cmm 파일 실행명령
DO [filename.cmm]
cmm 파일 실행 명령은 “do”를 사용합니다. 만약 filename앞에 path를 지정하지 않으면 현재 directory로부터 파일을 찾아 실행하게 됩니다. 현재 path의 확인은 Command line에서 “pwd”라는 명령을 통해 확인할 수 있습니다.
2) 작업 directory 변경과 동시에 선택된 cmm파일 실행명령
CD.DO [filename.cmm]
CD는 ChangeDirectory 약어로 DO 명령과 함께 사용하면(CD.DO) 정의된 .cmm파일이 위치한 Path를 현재 작업 directory로 변경하는 기능과 동시에 해당 .cmm파일을 실행하게 됩니다.
Built in device driver Init함수 하나씩 실행하고 Debugging
Linux에서는 booting중 built in device driver Init 함수와 같은 한번씩 Call 되어 실행되어야 하는 함수들을 do_one_initcall()이라는 함수에 의해 call하여 실행하게 됩니다. 따라서 do_one_initcall()를 이용해 __Initcall_start[]에 등록된 초기화가 필요한 함수들을 call하여 실행하는 과정을 따라가며 검증해 볼 수 있습니다.
1) 우선 iTSP가 설치된 폴더의 OS\Linux\do_one_initcall.cmm을 열어 실행합니다.
2) 해당 Script를 실행하면 do_one_initcall()에 Breakpoint가 설정되며 __Initcall_start[]에 등록된 함수 이름들을 보여 줍니다.
3) Go 하게되면 do_one_initcall()에서 멈추게 되며 Break.List윈도우는 노랑색 바탕으로 BreakPoint가 Trigger되었음을 알려주며 call될 init 함수의 윈도우가 열립니다. do_one_initcall()의 parameter인 “fn”은 다음에 call될 ipc_ns_init()을 가리키는 pointer임을 알수 있습니다.
Call될 ipc_ns_init() 함수까지 실행하고 해당 함수가 정상적으로 실행되는지 확인합니다.
4) 다음 init 함수의 실행과정을 보고자 한다면 다시 Go하여 do_one_initcall()에서 멈추게 하고 앞의 3)과 같은 순서를 반복합니다.
5) 만약 __Initcall_start[]에 등록된 특정 함수부터 실행 과정을 보고자 한다면 먼저 아래 그림과 같이
“Disable All” 버튼을 눌러 기존 BreakPoint를 모두 disable시킵니다.
6) 다음은 __initcall_start[] 변수 윈도우의 함수 call list에서 원하는 함수 선택 후 우클릭하면 PopUp 메뉴가 나타나게 되며 >> Display Memory 클릭 >> PopUp에서 Indirect List를 클릭합니다.
7) 해당 함수 윈도우가 열리면 함수이름을 선택한 후 우클릭하여 “Go Till”을 클릭하면 선택한 함수까지 실행하고 오게 됩니다.
8) 다음은 “Enable All” 버튼을 눌러 do_one_initcall()에 설정된 BreakPoint를 활성화 하고 3) 과정을 반복합니다.
PowerView 윈도우를 text 파일로 저장하는 방법
TRACE32 PowerView의 윈도우를 Text 파일로 저장하여 공유하고 싶은 경우가 가끔 있습니다. 물론 메모리 윈도우와 같이 윈도우에 보이지 않는 영역까지도 그렇게 하고 싶은 경우가 있습니다. 해당 기능은 아래 3개 명령의 조합으로 가능합니다. Printer를 Open하고 Print하고 Printer를 Close하는 순으로 이루어 집니다.
PRinTer.OPEN [filenameTosave.txt]
WinPrint.[Window Name]
PRinTer.CLOSE
Ex) PRinTer.OPEN MemDump.txt ; 명령을 이용해 저장할 text 파일을 지정합니다.
WinPrint.Data.Dump 0xC0008000++0xFF ; 저장할 윈도우를 지정합니다.
PRinTer.CLOSE ; 열었던 Printer와 저장파일을 Close합니다.
EDIT MemDump.txt ; 저장된 text 파일을 엽니다.
다음은 위 예제의 결과입니다.
break points 설정을 파일로 저장해 두고 다음에 사용하는 방법
1) TRACE32 Command line에서 “Break.List” 명령을 입력하거나 단축아이콘 중 버튼을 클릭하면 현재 설정된 BreakPoint 정보를 담고 있는 BreakPoint List 윈도우가 열립니다.
2) “Break.List”윈도우에서 “Store”버튼을 눌러 File Browse box가 뜨면 현재 설정된 Break List를 .cmm 파일로 저장합니다.
3) 작업하다 저장해 놓았던 BreakPoint 들을 다시 로드하여 사용하길 원한다면 “Break.List” 윈도우에서 “Load” 버튼을 클릭해 저장해 놓았던 .cmm파일을 선택합니다. 그러면 .cmm에 저장되었던 BreakPoint들을 복원해 주게 됩니다. 또는 “DO” 명령을 사용해서 저장해 놓았던 .cmm파일을 실행하는 것도 한 방법입니다.
watch window 설정을 파일로 저장해 두고 다음에 사용하는 방법
1) 먼저 변수 등록 윈도우(Var.Watch)에 원하는 변수들을 등록합니다.
2) Window 메뉴 >> Store Windows to …. 을 클릭하여 File Browse 윈도우가 열리면, “Var.Watch” 윈도우를 포함한 현재 열린 윈도우들을 .cmm파일로 저장합니다. 그러면 “Var.Watch”에 등록된 변수정보와 함께 윈도우 정보를 저장하게 됩니다.
3) 만약 저장해 두었던 변수들에 대한 정보를 다시 로드하고 싶다면 Window 메뉴 >> Load Windows from …. 을 클릭하여 File Browse 윈도우가 열리면 저장했던 cmm을 선택하여 실행합니다. 실행하면 저장되었던 윈도우들과 “Var.Watch” 추가되었던 변수들이 그대로 복원 됩니다.
4) 만약 변수정보만 cmm파일로 저장해 놓고 사용하고 싶다면 이전에 저장했던 .cmm을 연 후 각 라인들 중 VAR.ADDWATCH를 포함하는 라인들만 제외하고 모두 지우면 되겠습니다.
Lock-up 시 마지막 PC 값 확인하기
CortexA9/A15/A7 등의 Debug Register에는 PCSR(Program Counter Sampling Register)라고 있는데 이를 이용하여 SNOOPer Trace라고하는 기능을 사용할 수 있습니다. 이는 특정시간마다 PC값을 Sample하여 Code의 실행 궤적과 실행 빈도등을 분석할 수 있으며 Lock-Up시 마지막 실행했던 명령어의 PC 값을 확인 할 수도 있습니다.
Lock-Up시 PC 값 확인하기
1) 우선 Target 연결을 위한 설정 후 “SYStem.Mode Attach”로 연결합니다. Lock-Up이라 하더라도 APB BUS가 죽지 않는 한 Attach는 문제가 없는 것이 보통입니다.
2) Trace 메뉴 >> Configuration을 클릭하면 Trace 윈도우가 열립니다.
3) Trace 윈도우에서 MOTHOD >> SNOOPer 선택, Mode >> PC 선택, state >> OFF 선택
4) Trace 윈도우에서 state >> Arm 으로 선택하면 sample된 PC 값들을 저장하게 됩니다.
5) state >> OFF로 선택하여 PC 값 저장을 멈춘 후 “List” 버튼을 클릭하면 Lock-Up된 Target이라면 고정된 PC 값들이 Sample되어 Recording되어 있는 것을 확인 할 수 있습니다. 다시말해 List내에 보이는 값들이 Lock-Up당시의 PC 값들이 됩니다. 좌측의 “run” 열은 Multi-Core인 경우 Core 번호를 의미하며 아래 그림에서 Lock-Up시 Core0의 PC 값은 0xC3E44060이며 Core1의 PC 값은 0x00000158입니다.
Code 실행 궤적 구하기
1) Trace 메뉴 >> Configuration을 클릭하면 Trace 윈도우가 열립니다.
2) Trace 윈도우에서 MOTHOD >> SNOOPer 선택, Mode >> PC 선택, state >> OFF 선택
3) Target을 Go(Run)시키면 PC값 Sample을 시작하게 되고 Target을 Stop시키면 Sample을 멈추게 됩니다.
4) 다음은 Trace 윈도우에서 “List” 버튼을 클릭하여 Sample된 PC값들을 확인합니다. PC 값만으로 분석이 어려우므로 “SNOOPer.List” 윈도우의 “Chart” 버튼을 클릭하여 함수 Chart로 대략적인 Code 실행 궤적을 확인합니다. 특정 시간마다의 PC 값 Sample이므로 대략적인 궤적이 되겠습니다.
함수 수행 시간 알아내는 방법
함수 실행시간을 알아보는 방법은 크게 3가지 정도 있겠습니다.
1) PC의 SW timer를 이용해 측정하는 방법
2) BMC(PMU)기능을 이용하여 측정하는 방법
3) ETM을 비롯한 CoreSight logic을 이용해 측정하는 방법
3)번 항목의 경우 ETM Trace 데이터를 저장할 수 있는 장비가 있어야 하므로 여기서는 1)/2)에 대한 설명을 진행하도록 하겠습니다.
PC의 SW timer를 이용해 측정하는 방법
TRACE32 명령 중 RunTime이라는 명령을 이용합니다.
1) Command line에서
RunTime.RESet
RunTime
을 입력합니다.
2) BreakPoint와 같은 TRACE32 기능을 이용하여 원하는데까지 실행한 후 멈추게 되면 아래와 같이 시간 정보들이 보이게 된다. 아래 빨간 박스로 표기한 항목이 실행하는데 걸린 시간을 의미 합니다. 다만 이시간은 PC의 Software Timer를 사용하기 때문에 ms단위의 오차 범위를 갖습니다. 따라서 매우 큰단위 시간을 측적할 때 의미가 있겠습니다.
BMC(BenchMark Counter) 기능을 이용해 측정하는 방법
BMC는 ARM에서 제공하는 PMU(Performance Monitoring Unit)의 Event Couter를 이용하여 Target Hardware로 부터 동작 정보를 얻어내는 기능입니다.
1) TRACE32 Command line에서 ”BMC” 명령을 입력합니다. BMC 윈도우가 열리면 ”AutoInit”을 체크하고 ”CLOCK”항목을 CPU core 동작 clock(가급적 정확한 값 설정할 것)으로 설정합니다.
2) 다음은 BMC의 ”Event”를 ”Clockcycles”로 설정합니다. 이는 실행 중 몇 개 Clockcycles을 사용했는지 세는 Counter Event 설정을 위한 것입니다. ”ratio” 항목은 ”X/CLOCK”으로 설정합니다.
3) BreakPoint와 같은 TRACE32 디버깅 기능을 이용하여 현재 시점부터 측정하고자 하는 코드나 데이터 Read/Write 조건을 걸어 Target를 Go(Run)시켜 측정하고자 하는 곳까지 실행 후 멈추도록 합니다. 그러면 BMC는 아래와 같이 실행시간동안 발생된 설정 Event의 숫자를 세어 기록해 줍니다.
아래 그림을 보면 Core0의 실행시 Clock 소요 수는 313861626이며 시간은 392.327ms가 됩니다. Core1의 경우 Clock 수는 3601이며 차이가 Core1과 차이가 나는 것은 Core1이 Sleep상태에 들어가기 때문입니다. 즉 BMC를 이용한 시간 측정은 Core가 살아있는 상태의 시간만을 측정할 수 있으며 Frequency Scaling 을 사용한 경우 시간 오차가 발생하게 됩니다.
각 정보(Ex. Register/ Data.Dump/ Var.Watch) 윈도우의 변동된 값 Highlight하기
TRACE32 PowerView는 열려 있는 각 윈도우에 속성을(옵션을 통해) 추가할 수 있게 되어 있습니다.
Register/Data.Dump 윈도우의 변경된 값 Highlight하기
속성을 추가하는 방법은 아래 그림과 같이
1) 속성을 변경하고자 하는 윈도우 헤더에 커서를 가져간 후 우클릭하면 윈도우 테그(곧 그 윈도우를 여는 명령)가 Command line으로 내려오게 됩니다.
2) 해당 명령에 한칸 띄운 후 “/”를 하면 아래 그림과 같이 “/” 밑에 올 수 있는 옵션들이 버튼 형식으로 재 구성되어 보이게 됩니다. 여기서 “SpotLight” 옵션을 추가한 후 “Enter”를 입력합니다. 만약 “SpotLight” 옵션이 없다면 해당 윈도우에는 “SpotLight” 옵션을 지원하지 않는 경우입니다. 다시말해 해당 옵션을 지원할 필요가 없는 윈도우인(Ex. Data.List) 경우 입니다.
3) 프로그램 프로그램 Go(Run)를 한다든지 Step 등을 실행하면 해당 윈도우의 값들이 변경될 경우 변경된 값들은 Highlight되어 표시됩니다.
4) Memory Dump(Data.Dump) 윈도우에 해당 옵션을 추가하는 방법 역시 Register 윈도우와 동일한 방법과 순서에 따라서 적용하시면 되겠습니다.
변수(Var.Watch 등) 윈도우의 변경된 값 Highlight하기
변수윈도우 경우는 변수 별로 ”보기 Format”을 각각 지정할 수 있기 때문에 윈도우의 옵션(“/”)으로 ”SpotLight” 속성을 설정하는 것이 아니라 Format(”%”)으로 속성을 지정합니다.
1) 변수 윈도우 헤더에 우클릭 후 Command line에 해당 명령이 내려 오면 ”formats” 버튼을 클릭하거나
“%”를 입력하면 추가할 Format 관련 버튼들이 재구성 됩니다. ”SpotLight” 버튼을 클릭하거나 명령어 뒤에 ”%SpotLight”를 직접 입력하고 ”Enter”하면 변수윈도우에 ”SpotLight” 속성이 적용됩니다. 이후 확인하고자 하는 변수들을 변수 윈도우에 추가합니다.
2) 프로그램 Go(Run)를 한다든지 Step 등을 실행하면 해당 윈도우의 값들이 변경될 경우 변경된 값들은 Highlight되어 표시됩니다.
변수/메모리윈도우를 열 때 HighLight 속성을 기본 속성으로 갖도록 설정하기
TRACE32 PowerView는 각 윈도우 들에 대한 속성뿐아니라 PowerView 환경에 대한 기본 설정 값들을 변경하는 ”SETUP” 명령을 가지고 있습니다. 여기서는 변수/메모리 윈도우 속성에 대한 부분만 설명하도록 합니다.
SETUP.DUMP /SpotLight ; 메모리 윈도우에 ”SpotLight” 속성 지정
SETUP.Var %SpotLight ; 변수 윈도우에 ”SpotLight” 속성 지정
TRACE32 실행 후 상기 명령을 한번 실행한 후 메모리 윈도우나 변수 윈도우들을 열게될 경우 기본적으로 ”SpotLight” 속성이 적용된 상태가 되도록 합니다.
아래 그림은 상기 명령들을 실행한 후 윈도우를 연 예제이며 ”/SpotLight” 옵션이 윈도우에 적용되어 있지 않더라도 값들이 Highlight되어 표시되는 것을 볼 수 있습니다.
TRACE32를 매번 실행할 때마다 위 명령들을 실행하면 많이 불편하므로 설치 폴더에 있는 t32.cmm 파일의 마지막 라인 ”ENDDO” 앞에 위 두 명령을 삽입해 놓으면 TRACE32를 실행할 때마다 t32.cmm를 실행하기 때문에 자동으로 관련 속성이 적용될 것이므로 유용하게 사용할 수 있을 것입니다.
Frame buffer 의 image 확인
Linear한 Address 공간에 Image Data가 있는 경우
특정 메모리 공간에 있는 Frame Buffer Image를 PC에서 그림으로 보여주는 기능을 가지고 있습니다. 해당기능을 하는 명령은 다음과 같습니다.
Data.IMAGE [Image Address] [Lines] [Rows] [Image Format]
Ex) Data.Image A:0xC3F00000 320. 240. /RGBX888LE
Image Address: “Memory Class”를 기술하지 않으면 현재 CPU의 상태를 default로 적용합니다.
Imgge format: 아래그림과 같이 Command line에 명령을 입력하면 지정할 format을 확인할 수 있습니다.
TRACE32 maintenance
TRACE32 Version 확인
TRACE32 Help 메뉴 >> About TRACE32를 클릭하거나 Command line에서 “VERSION” 명령을 입력하여 다음 윈도우를 띄웁니다. 크게는 Software Version/License Info./Hardware Version항목으로 나뉘어 있습니다. ”More” 버튼 클릭으로 추가 정보를 보여 줍니다.
1) Software Version: 현재 사용하고 있는 TRACE32 PowerView 버전 정보를 알려줍니다.
2) License: 현재 사용되고 있는 JTAG License Cable(License Module)에 License 정보를 보여 줍니다. 여기
는 Debugger License 종류와 License maintenance 기간을 보여줍니다. License maintenance
기간은 해당 기간 내 Software Version을 무기한 사용할 수 있다는 의미를 갖습니다.
3) Hardware: 연결된 Hardware 장비(ICD, License Module)에 대한 정보를 보여 줍니다.