MDSTECH
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객지원
뉴스레터
Q&A
FAQ
원격지원
검색창
검색버튼
회원가입
로그인
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객 지원
뉴스레터
Q&A
FAQ
원격지원
사이트맵 보기
Live Recoder user Guide 문서 원본 보기
←
Live Recoder user Guide
이동:
둘러보기
,
검색
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게만 가능합니다:
사용자
문서의 원본을 보거나 복사할 수 있습니다:
<h2><span style="font-size: small;">Overview</span></h2> <p><span style="font-size: small;">본 자료는 JTAG이나 gdb와 같이 Application을 디버깅하기 위한 별도의 연결과정이 필요없는 Software Debugging Solution인 Live Recorder의 사용 방법을 정리한 문서입니다</span></p> <p><span style="font-size: small;">Live Recorder는 Linux Application의 수행정보를 실시간으로 저장하는 솔루션이며, 저장된 정보는 UndoDB를 통해서 디버깅에 활용할 수 있습니다.</span></p> <p><span style="font-size: small;">본 문서를 통해 Live Recorder를 이용해서 recording data를 얻는 방법과 Undodb를 이용해서 복원 및 분석하는 방법을 이해할 수 있습니다.</span></p> <p><span style="font-size: small;">본 문서에서는 segmentation fault을 일으키는 간단한 application 코드를 이용해서 실습합니다. 해당 예제를 컴파일 한 후 실행하면 아래와 같이 segmentation fault를 발생시킵니다.</span></p> <p><img src="/data/wiki/2015-08-28/1440724470.jpg" alt="" /></p> <p><span style="font-size: small;"> 해당 소스는 아래와 같습니다.</span></p> <p><img src="/data/wiki/2015-08-28/1440724540.jpg" alt="" /></p> <h2><span style="font-size: small;">사용 환경</span></h2> <p><span style="font-size: small;">Live Recorder는 application을 디버깅하기 위해서 별도의 연결작업이 필요하지 않습니다. 그렇기 때문에 recording data를 확보하기 위해서는 추가 작업이 필요합니다. 이는 application의 일부 소스를 수정해야 recording data를 확보할 수 있습니다.</span></p> <p> </p> <h2><span style="font-size: small;">준비 사항</span></h2> <h3><span style="font-size: small;">Debugging Symbol</span></h3> <p><span style="font-size: small;">C/C++ 소스 레벨로 디버깅을 위해서는 symbol 정보가 필요합니다. Symbol 정보는 컴파일 시에 option에 의해 결정됩니다.</span></p> <p><span style="font-size: small;">일반적으로 symbol 정보가 정상적으로 만들어지는 경우 makefile 내의 CFLAG 옵션에 –g 가 포함이 되어 있습니다. Symbol정보가 정상적으로 만들어진 경우 디버깅 시 C/C++ 소스 레벨로 디버깅이 가능합니다.</span></p> <p><span style="font-size: small;">Symbol 파일이 정상적으로 만들어졌는지 확인하고자 할 때는 linux 명령어 중 file/readelf 명령어를 이용해서 확인 가능합니다.</span></p> <p><img src="/data/wiki/2015-08-28/1440724571.jpg" alt="" /></p> <p> </p> <h3><span style="font-size: small;">Live Recorder 사용을 위한 Header 파일과 Library 파일</span></h3> <p><span style="font-size: small;">Live Recorder를 이용하기 위해서는 header file(undolr.h)과 library(libundolr_xxx.a 혹은 libundolr_xxx.so)가 필요합니다.</span></p> <p><img src="/data/wiki/2015-08-28/1440724597.jpg" alt="" /></p> <p> </p> <p><span style="font-size: small;">Live recorder를 이용해서 recording을 하기 위해서는 특정 함수를 이용합니다. 해당 함수는 undolr.h 파일에서 확인할 수 있습니다.</span></p> <p><img src="/data/wiki/2015-08-28/1440724623.jpg" alt="" /></p> <p><span style="font-size: small;">이 중에서 undolr_recording_start(), undolr_save() 그리고 undolr_save_on_termination() 함수를 가장 많이 활용합니다.</span></p> <p> </p> <h2><span style="font-size: small;">Porting</span></h2> <p><span style="font-size: small;"> Live Recorder를 사용해서 recording data를 확보하는 방법은 두 가지가 있습니다.</span></p> <p><span style="font-size: small;"> 첫 번째로 마지막에 저장될 함수 위치를 아는 경우와 두 번째로 exception 발생으로 인한 비정상적인 종료로 인해 함수 위치를 모를 경우 이렇게 두 가지로 나뉠 수 있습니다.</span></p> <p> </p> <p><span style="font-size: small;">마지막에 저장될 함수 위치를 아는 경우</span></p> <ol> </ol> <p><span style="font-size: small;"> 1. 먼저 디버깅할 소스에 live recorder의 함수를 사용하기 위해 header file을 include합니다.</span><br /><span style="font-size: small;"> 해당 header file이 동일한 폴더에 있으면 현재 폴더 기분으로 입력하면 되고, 다른 경로에 있으면 해당 경로를 추가해서 include하면 됩니다.</span></p> <p><img src="/data/wiki/2015-08-28/1440724650.jpg" alt="" /></p> <p><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>2. Recording을 시작하기 위해서는 undolr_recording_start() 함수를 원하는 위치에 입력합니다. 해당 코드가 실행 후에 recording을 시작합니다. 일반적으로는 main함수 진입부터 입력하면 됩니다.</span><br /><img src="/data/wiki/2015-08-28/1440724672.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>3. Recording을 중단하고 싶은 위치에 undolr_save() 함수를 이용합니다.</span><br /><img src="/data/wiki/2015-08-28/1440724696.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>4. 전체 코드를 정리하면 아래와 같습니다. Main의 마지막 코드까지 recording을 하는 것이 아니라 중간의 일부 코드까지만 recording을 합니다.</span><br /><img src="/data/wiki/2015-08-28/1440724727.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>5. 컴파일 할 때 live recorder library와 함께 컴파일을 합니다. 정상적으로 컴파일이 되면 실행파일이 생성됩니다.</span><br /><img src="/data/wiki/2015-08-28/1440724756.jpg" alt="" /><br /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>6. 해당 실행 파일을 실행하면 아래와 같이 recording 파일이 생성됩니다.</span></p> <ol> </ol> <p><img src="/data/wiki/2015-08-28/1440724778.jpg" alt="" /></p> <p> </p> <h2><span style="font-size: small;">Exception에 의해서 정확한 위치를 모를 경우</span></h2> <p><span style="font-size: small;">일반적으로 exception이 발생하게 될 경우 해당 application이 어디서 문제가 발생해서 죽는지 알 수 없습니다. 이런 경우 undolr_save() 함수를 통해서 recording된 data를 파일로 저장하기가 쉽지 않습니다. 이와 같이 save할 위치를 정확히 알 수 없는 경우에는 undolr_recording_start() 함수 후에 undolr_save_on_termination() 함수를 사용하면 application이 죽는 직후 recording data를 자동으로 저장시켜 줍니다.</span></p> <p> </p> <p><span style="font-size: small;"><span style="white-space: pre;"> </span>1. Undolr_recording_start() 함수 아래에 undolr_save_on_termination()함수를 추가합니다.</span><br /><span style="font-size: small;"><span style="white-space: pre;"> </span> 해당 함수가 실행 후 비정상 종료가 되면 자동으로 recording file로 저장합니다.</span><br /><img src="/data/wiki/2015-08-28/1440724804.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>2. 다시 컴파일 후 실행 파일을 실행합니다.</span><br /><img src="/data/wiki/2015-08-28/1440724832.jpg" alt="" /><br /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>3. 해당 application은 segmentation fault를 발생시키기 때문에 문제가 되는 위치를 마지막으로 exception_termi.undo 파일로 저장됩니다.</span></p> <ol> </ol> <p><img src="/data/wiki/2015-08-28/1440724856.jpg" alt="" /></p> <h2><span style="font-size: small;">Loading</span></h2> <p><span style="font-size: small;">Recording data를 복원하는 방법은 undodb-gdb를 통해서 가능합니다.</span></p> <p><span style="font-size: small;">복원 명령어는 undodb-gdb --undodb-load <filename> 명령어를 통해서 로드합니다.</span></p> <p> </p> <h3><span style="font-size: small;">마지막에 저장될 함수 위치를 아는 경우의 recording data</span></h3> <p><span style="font-size: small;">앞에서 undolr_save()함수를 통해서 특정 위치까지 recording한 exception.undo 파일을 로딩한 후 저장된 위치를 확인해 봅니다.</span></p> <p> </p> <p><span style="font-size: small;"><span style="white-space: pre;"> </span>1. 로딩하는 명령어를 이용해서 recording file을 로딩합니다.</span><br /><img src="/data/wiki/2015-08-28/1440724900.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>2. 로딩이 제대로 되면 continue 명령을 통해 recording data를 한번 실행해야 합니다.</span><br /><span style="font-size: small;"><span style="white-space: pre;"> </span> Cont를 하면 마지막까지 저장된 recording data를 확인할 수 있습니다.</span><br /><img src="/data/wiki/2015-08-28/1440724922.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>3. Backtrace 명령을 통해 해당 call stack 정보를 확인합니다.</span><br /><span style="font-size: small;"><span style="white-space: pre;"> </span> 마지막에 저장된 함수는 undolr_save() 함수인 것을 확인할 수 있습니다.</span><br /><img src="/data/wiki/2015-08-28/1440724942.jpg" alt="" /><br /><br /></p> <p><span style="font-size: small;">Undolr_save()함수를 이용해서 recording을 하게 되면 무조건 마지막 함수는 undolr_save()함수가 되며, undolr_recording_start()함수부터 undolr_save()함수까지의 data만 recording이 됩니다.</span></p> <p> </p> <h3><span style="font-size: small;">Exception에 의해서 정확한 위치를 모를 경우의 recording data</span></h3> <p><span style="font-size: small;">Application 종료가 되는 위치를 모를 경우에는 위에서 undolr_save_on_termination() 함수를 이용했습니다. 해당 함수를 이용하면 해당 application이 exception이 발생해서 어느 위치에서 죽든 죽는 위치를 마지막으로 recording 파일이 생성됩니다.</span></p> <p><span style="font-size: small;"> Undolr_save_on_termination()함수를 이용해서 저장한 exception_termi.undo 파일을 로딩합니다.</span></p> <p> </p> <p><span style="font-size: small;"><span style="white-space: pre;"> </span>1. 로딩하는 명령어를 이용해서 recording 파일을 로딩합니다.</span><br /><img src="/data/wiki/2015-08-28/1440724981.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>2. 로딩이 완료 후 continue 명령어를 통해 recording data를 실행해 줍니다.</span><br /><img src="/data/wiki/2015-08-28/1440725005.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>3. Backtrace 명령을 통해 마지막에 수행된 코드를 확인합니다. 아래 에서는 main에서 memcpy관련 함수를 수행한 것을 확인할 수 있습니다.</span><br /><img src="/data/wiki/2015-08-28/1440725030.jpg" alt="" /><br /><br /><span style="font-size: small;"><span style="white-space: pre;"> </span>4. Main 함수의 정보를 보면 exception_lr.c 파일의 48 line에서 호출된 것을 볼 수 있는데 list명령을 통해서 코드 정보를 확인합니다.</span><br /><span style="font-size: small;"><span style="white-space: pre;"> </span> memcpy 함수인 것을 확인할 수 있으며, 해당 함수 수행 중 segmentation fault가 발생한 것을 확인할 수 있습니다.</span><br /><img src="/data/wiki/2015-08-28/1440725052.jpg" alt="" /></p> <h2><br /><span style="font-size: small;">결론</span></h2> <p><span style="font-size: small;">Application이 동작 중에 갑자기 죽는 문제가 발생하면 디버깅하기 어렵습니다. 특히 field 테스트나 양산 테스트 진행 중 간헐적으로 발생하는 문제의 경우는 더욱더 힘듭니다. 이런 경우 Live Recorder를 포팅한 후 문제가 발생할 경우 recording data를 확보하게 되면 어디서 어떤 원인인으로 문제가 발생했는지 application 실행 상황을 그대로 재현할 수 있습니다.</span></p> <p><span style="font-size: small;">디버깅 시간 및 개발 기간을 단축시키는 것은 비용 절감에 큰 도움이 됩니다. </span></p>
Live Recoder user Guide
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
변수
보기
읽기
원본 보기
역사 보기
행위
검색
TRACE32 Dummy
TRACE32
iTSP User's Guide
aTSP User's Guide
Linux Debugging
Debugging Tips
Trace Analysis
Virtual Target
TRACE32로 바라본 ARM
TRACE32 FAQ
TRACE32 Trouble Shooting
TRACE32 Software Update
Software Revision History
DT10 / DT-Win
다운로드
DT10 Evaluation
DT-Win Evaluation
TestPoint 삽입 Error
Build Error
DT10 FAQ
도구
여기를 가리키는 문서
가리키는 글의 바뀜
특수 문서 목록
문서 정보