PowerTRACE 활용한 차량용 SW 디버깅가이드
"PowerTRACE 활용한 차량용 SW 디버깅가이드"에 대한 답변입니다.
목차
변수 로깅
Break point를 이용해 특정 변수의 값의 변화를 관찰 할 수 있다. Break point는 onchip에서 제공하는 갯수 만큼 사용 가능 하며, 프로그램 flow trace(BTM)를 disable하면 변수 로깅 시간을 늘릴 수 있다.
변수 로깅 설정 하기
Break point 설정
- 명령어로 설정 하려면 아래와 같은 순서로 실행 한다.
B::trace.init
B::v.break.set <var_name> /write /tracedata
B::nexus.btm.off
B::trace.list
B::go
- GUI로 설정 : 아래와 같이 설정 후 타겟을 실행 시킨다.
타겟 실행이 멈춘 후Traced data 확인
- address : 변수의 주소
- cycle : wr-long, long 크기(32bit)로 write됨
- data : write된 값
- symbol : 변수의 심볼 정보
- ti.back : 변수에 값이 write된 interval time
Traced data를 기반으로 find기능 활용 하기
Ex – 0x100값이 write된 경우 찾기
B::trace.find cycle.write data.l 0x100
로깅된 변수의 값의 변화를 그래프로 관찰 하기
B:: trace.draw data.l /filter address stat1
코드 수행 시간 측정 및 결과 확인
TRACE 및 Nexus 환경 설정
- 명령어를 이용한 설정 방법
B::trace.method.ANALYZER
B::nexus.on
B::nexus.btm.on
- trace설정이 마무리 되면 타겟을 실행 하고 trace를 종료할 시점에 타겟을 멈춘다
- Traced data 확인
Trace.chart.symbol window를 이용해 인터럽트 수행 interval 시간 측정 하기
- 측정 하고자 하는 시작 위치에 마우스 우클릭 후 “Set Zero” 설정
- 측정 하고자 하는 종료 위치에 마우스 클릭 후 팝업 창에서 C-Z 값을 확인
프로그램 수행 시간에 대한 통계 확인 하기
- B::Trace.statistic.func : 함수 기준 정보 출력
- B::trace.statistic.symbol : 심볼 기준 정보 출력
- address : 함수 정보. 만일 심볼이 제공되지 않는 영역의 코드가 실행되면, (other)로 귀속된다.
- total : 총 호출 된 횟수
- min : 최소 수행 시간
- max : 최대 수행 시간
- avr : 평균 수행 시간
- ratio : cpu 점유율
OS기반의 TRACE
Awareness 적용
차량용 OS로 주로 사용되는 OSEK/AUTOSAR의 경우 ORTI파일을 이용해 TRACE32에서 커널의 정보를 쉽게 파악 할 수 있다.
- B::task.orti ”file_name.ort” 명령어를 실행하여 적용
Task Switching 정보
TASK 실행 통계 정보
CTS(Context Tracking System) 기능 활용
프로그램 수행 중 오류가 발생 되었을 경우 오류를 발생 시킨 원인이 되는 문제를 찾는데 유용하며, 프로그램 flow와 변수 및 data의 변화를 함께 관찰하는 것이 가능 하다.
CTS기능 실행 방법
- 프로그램이 오류가 발생 될 때까지 실행 한 후 타겟을 멈춘다.
- Data.list, trace.chart.symbol, trace.list 윈도우를 /track 옵션 적용 하여 실행
B::data.list /track
B::trace.symbol.chart /track
B::trac.list /track
- /track 옵션 적용을 적용하면 적용된 윈도우들은 같은 위치를 가리키게 된다.
- Trace.list나 trace.chart.symbol 중 디버깅을 시작 할 위치를 찾은 후 아래와 같이 CTS기능을 활성화 시킨다.
- CTS가 실행 되면 TRACE32의 상태 정보와 data.list 윈도우의 창이 노란색으로 바뀐다. Data.list윈도우의 상단 버튼을 이용하거나 팝업 메뉴의 go till, go back till 기능을 이용하여 분석 및 디버깅을 하면 된다.
- CTS를 활용하여 디버깅 중 관찰 하고자 하는 변수가 있다면 Var.Watch 윈도우에 등록하여 프로그램 수행 중 바뀐 값을 확인할 수 있다
Code Coverage
- Code Coverage는 trace data를 기반으로 코드의 실행 유무를 보여준다.
실행 방법
- B::Coverage.ListFunc 실행 후 Add를 클릭하여 trace data를 coverage 정보로 변환 한다.
- Tree를 확장하여 세부 정보를 확인 할 수 있고, 더블 클릭하면 실행 된 소스와 실행 안된 소스를 구분하여 보여 준다.(흰색 : 실행 됨, 노란색 : 실행 안됨)
PowerOff(reset) 디버깅
- 예상되지 않는 리셋이 발생 되는 경우 리셋이 발생되어 타겟과 디버그 연결이 끊어지더라도 이미 저장된 trace data를 기반으로 디버깅 할 수 있다.
TRACE32 설정 하기
- /vm 옵션을 적용하여 실행파일(.elf)을 다시 로드 한다.
- TRACE 설정에서 ACCESS를 VM으로 설정
- 문제가 재연 될 때 까지 타겟을 실행 시키고, 리셋이 발생 되면 다음과 같이 디버그 연결이 해제된다.
- 디버그 연결이 해제 되더라도 trace 정보는 남아 있으며 trace.chart.symbol 윈도우나 CTS기능을 활용하여 리셋이 된 원인을 디버깅 한다
TRACE data의 저장과 simulator를 이용한 분석
- ELF파일과 저장된 trace data를 이용하여 PowerTRACE가 연결이 되어 있지 않더라도 디버깅이 가능 하다. 따라서 문제 상황의 trace data를 저장하여 여럿이 동시에 분석 할 수 있다.
Trace data 저장하기 – trace.save 명령 이용
- 저장이 완료되면 지정된 경로에 저장된 파일을 확인 할 수 있다.
Trace data를 simulator에서 복원 하기
- T32start.exe(C:\T32\bin\windows\T32start.exe) 유틸을 실행
- T32start 유틸에서 시뮬레이터를 생성하고 코어를 선택한 후 실행 한다
- 시뮬레이터가 실행되면 아래 명령어를 실행하여 trace data와 elf파일을 로드 한다. elf파일을 로드할 시 유의 사항은 반드시 trace data를 저장했을 때 사용했던 elf파일을 사용해야 한다.
B::system.cpu mpc5676r ;CPU 선택
B::system.mode.up ;debug mode실행
B::trace.load C:\T32\bin\trace_dump.bin ;trace data 로드
B::data.load.elf .../internal_flash.elf ;심볼 로드
- 위 과정이 마무리 되면 simulator에서도 trace기능을 활용 하여 디버깅 하면 된다.