사이트맵 보기

활용사례

[디버깅사례-중계기] Call중의 Exception

작성일

작성자 관리자

조회수 4988

첨부파일


1. 증 상:
통신장비(중계기) 동작 중에 갑자기 동작이 멈추는 현상(Dead lock) 발생

2. 사용장비와 고객 개발환경
TRACE32-PowerTrace, ARM9-License Module, uCos-2(RTOS)

3. 해 결 절 차:
1) 먼저 Prefetch Abort exception을 확인해 보니 Program Counter은 Code area내에 위치 해야 하는데 Chip의 Data sheet를 확인해 본 결과, 0xEAxx xxxx 번지는 사용되지 않는 Reserved 된 영역임을 확인함

2) 0xEAxx xxxx 값은 주로 ARM assembly 에서 많이 볼 수 있는 값이라서 어떤 오류로 인하여 ARM assembly코드를 주소로 생각하고 branch 한 결과가 아닌가 생각하게 됨

3) uCos-II RTOS로 사용하므로 마지막으로 수행했던 TASK 정보를 확인 함

4) Task2가 수행 중이었고, Task2의 Stack 정보(OSTCBStkPtr)를 확인한 결과 모두 0x1000 2000 이라는 값으로 채워져 있음을 확인할 수 있음.
일반적으로 Stack은 0x0으로 초기화 하는 것이 일반적이고, Stack에는 주로 register에 들어가는 로컬변수의 값이나, 코드 수행 주소(Program Counter, Link Register 등)의 값이 들어가는 것이 일반적이라서 이렇게 일정한 값으로 깨진 것은 문제가 있다고 판단함.

5) 본 타깃이 일정하게 재현되지 않아 일반적인 JTAG Chain을 통한 디버깅에 어려움이 있어서 TRACE32-PowerTrace로 연결하여 증상이 재현될 때의 Trace된 data를 받아 분석함

6) Trace된 data를 이용하여 Task2의 Stack(0x35780번지)에 Write access가 발생한 경우를 모두 찾아보니 메모리 영역에서 쓰레기 값을 읽어와 Task2의 Stack 공간에 값을 Write하는 코드를 찾을 수 있었음


4. 정 리 :
CALL(호 처리) 특성상 타깃을 Halt시킨 상태에서의 값을 보는 JTAG Chain을 이용한 디버깅 방식으로 한계가 있어서 ETM(Embedded Trace Macrocell) Logic을 이용한 PowerTrace를 이용하여 문제의 원인을 밝혀 OS에 의한 Code 수정을 통해 운용 중에 장비 멈춤 현상을 해결함

5. 문제 재현 및 Bug Patch하는데 소요시간 : 1일

고객문의 기술지원/
데모/
SW요청
031-627-
3116