사이트맵 보기

활용사례

[디버깅경험] TRACE32를 이용해서 Android의 메모리 디버깅

작성일

작성자 임근식

조회수 12584

첨부파일

 



하드웨어적인 디버깅 방법인 Trace32을 사용하면,
리눅스 커널의 쓰레드와 메모리를 거의 전문가 수준으로 저수준 고급 디버깅이 가능합니다.


필자의 경우  안드로이드 플랫폼의 메모리의 디버깅, 분석, 트레이싱, 최적화를 해야 할때
T32를 엄청 요긴하게 사용하는 편입니다.

리눅스의 대표적인 무기인 Kprobe, Perf, Ftrace, KGDB 와 같은 소프트웨어적인
디버깅 솔류션으로 상당히 유용한 편입니다.
하지만, 소프트웨어 디버깅 솔류션만으로는
그 한계가 있는 몇몇  메모리 디버깅 작업들이 있습니다.


그 대표적인 사례로
필자는 아래의 메모리 디버깅 작업을 할때
Trace32를  유명한  한국 영화의 "신기전"처럼 애용하는 편입니다.

제경험상으론, 실제로 저 아래의 명령들을 익힌 덕분에 리눅스 커널의 메모리쪽
문제를 발견해서 리눅스 메일링 리스트에도 Contribute할수도 있었습니다.
아래에 요약 정리해놓은 명령들을 T32 공식 메뉴얼을 통해 조금만 더 관심있게
이해만 한다면 제품을 경쟁력 있게 만들기 위해서
정말 유용함에는 의심할 여지가 없었습니다.

P.S: 다만, 리눅스 배포판을 위한 T32의 설치 및 사용방법이 윈도우처럼 좀더
       Simple해졌으면 하는 바램입니다.



[목차: 제가 메모리관련하여 빈번하게 사용하는 고급팁]
1. MMU page table 정보를 열람하는 방법
2. 덤프한 정보를 파일로 저장하는 방법
3. 다이얼로그 방식처럼 보이지 않아도 되는 덤프
4. Trace32 덤프 다이얼로그 방식과 동일하게 덤프를 뜨는 방식
5. 덤프해놓은 메모리 내용물(=image)를 분석하는 방법
6. 메모리내용물들을 덤프한후에 나중에  다시 메모리로 불러오는 방법


 



#### 1. MMU page table 정보를 열람하는 방법


1) 태스크의 스케쥴링 정보 조회(예:커널쓰레드,프로세스)
    --> Type  B::  task.dtask   OR task.list

2) 리눅스 커널의 MMU 페이지 테이블 조회하기
    --> Type  B::  mmu.pt.dump

3) 특정 커널 쓰레드의 MMU 페이지 테이블 조회하기 
    --> Type  B::  mmu.pt.dump  0x+

4) 모든 프로세스들의  MMU 페이지 테이블 조회하기
    --> 지원되지 않음. "MMU translation fail"에러 만나게 됨.

5) 특정 프로세스의  MMU 페이지 테이블을 조회하기
    --> Type  B::  mmu.tpt.dump  0x+


리눅스 배포판의 경우 "./t32/pdf/general_ref_m.pdf"문서를 보면 많은 도움을 받을수 있습니다.
spaceid가 0X0000값인 경우 T32는 오직 커널공간으로써 커널 쓰레드임을 의미합니다.



.dump: Show the current processor/target MMU table (Linux Kernel).
.List: Show the current debugger MMU table.
.Scan: Scan the current processor/target MMU table into the debugger MMU table


 
 만약에, "MMU.TableWalk ON"(or TRANS.TableWalk ON)명령을 실행한다면,
 여러분들이 go/break 또는 step을 실행할때 T32는 자동으로 개발보드의 MMU정보를
 디버거의 MMU 테이블에 자동으로 업데이트 한다. 이것에 대한 기술적인 설명은
 ./t32/pdf/general_ref_m.pdf(Page 80~81)에서 더 많이 참고 할수 있습니다.


 


#### 2. 덤프한 정보를 파일로 저장하는 방법
 - 리눅스에서의 가상 메모리 관리: /opt/t32/pdf/training_rtos_linux.pdf (page 22 ~ page 29) 
 - MMU 지원 : /opt/t32/pdf/rtos_linux_stop.pdf (page 11 ~ page 13)
 예제)


  B:: PRINTER.FILETYPE.ascii
  B:: PRINTER.OPEN memorymap-20120504.txt
 
  B:: wp.mmu.pt.dump
  B:: PRINTER.CLOSE
 
  B::edit memorymap-info-20120504.txt


 


#### 3. 다이얼로그 방식처럼 보이지 않아도 되는 덤프
  : d.save뒤에 postfix로 옵션 추가시 binary 및 intehex 포맷까지 두루 지원합니다.
  - d.save.< postfix> < file name> < address range> (ENTER)
  예제) d.save.b regdump.txt 0x11800000--0x11840000
 


#### 4. Trace32 덤프 다이얼로그 방식과 동일하게 덤프를 뜨는 방식
  : ASCII로만 저장되고 Dialog에 표시된것과 유사하게 저장합니다.
  - printer.file < file name> (ENTER)
  - winprint.data.dump < address range> (ENTER)
  예제) printer.file regdump.txt (ENTER)
        winprint.data.dump 0x11800000--0x11840000 (ENTER)
 


#### 5. 덤프해놓은 메모리 내용물(=image)를 분석하는 방법
  : image를 T32화면에서 보기, option으로 여러 format형식이 따라옵니다.
  - d.image < start address> < width>. < height>. < format option>
  예제) d.image 0x80000000 320. 240. /RGB565



#### 6. 메모리내용물들을 덤프한후에 나중에  다시 메모리로 불러오는 방법
  : d.load.< postfix> < file name> < address range> (ENTER)
  -  < address range > 유형
      . < address >++< size >
      . < from_address >--< to_address >
  예제) d.save.b dump_1080p.txt asd:0x54000000++0x7e0000


 


이상.

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