220 likes | 347 Views
디버깅 환경 및 방법. Lecture #14. 강의 순서. Logic Analyzer, Background Debug Mode JTAG (Joint Test Action Group), Debug Monitor ROM Emulator, ICE (In-Circuit Emulator) GNU Debugger (Gdb). Logic Analyzer. 하드웨어 디버깅 도구로 시스템에 영향을 주지 않고 실시간 분석 가능
E N D
디버깅 환경 및 방법 Lecture #14
강의 순서 • Logic Analyzer, Background Debug Mode • JTAG (Joint Test Action Group), Debug Monitor • ROM Emulator, ICE (In-Circuit Emulator) • GNU Debugger (Gdb)
Logic Analyzer • 하드웨어 디버깅 도구로 시스템에 영향을 주지 않고 실시간 분석 가능 • 하드웨어 회로의 수십 혹은 수백 지점으로부터 읽은 신호(0 혹은 1)를 분석하여 화면에 display함 • logic analyzer의 주요 기능 • timing 모드: 각 지점의 timing 관계를 알 수 있음 • state 모드: 시스템의 상태를 알아낼 수 있음 (disassembler 사용) • logic analyzer의 한계 • target 시스템과의 연결 시에 물리적인 한계가 있음 • 프로세서 register 및 memory 내용을 직접 읽을 수 없음 • 프로세서가 cache를 사용하면 버스에 변화가 나타나지 않으므로 분석이 힘듦
Logic Analyzer - 그림 timing 모드 state 모드 logic analyzer
Background Debug Mode • 최근의 프로세서들은 프로세서 내에 디버깅을 용이하게 하기 위한 추가적인 회로와 디버깅 단자를 가지고 있음 • 이 디버깅 단자를 통하여 host 시스템과 target 시스템이 통신하면서 프로그램을 디버깅함 • Background Debug Mode의 기능 • register 및 memory 내용을 읽거나 변경함 • breakpoint를 설정하고 step 수행을 지원
JTAG (Joint Test Action Group) • target 보드에 장착된 칩의 핀(cell)들을 host에서 연결된 4~5개의 선을 통하여 직렬 방식(shift-register)으로 연결하여 테스트하는 방법 • JTAG 표준은 IEEE에 의하여 채택되었음 - IEEE 1149 Standard Test Access Port and Boundary-Scan Architecture • 프로세서(CPU)의 상태와 상관없이 target 보드에 장착된 모든 칩의 외부 핀을 구동시키거나 값을 읽을 수 있는 기능을 제공 • 소프트웨어 개발자는 flash memory를 fusing할 때도 JTAG을 사용
JTAG cell의 연결 • 각 JTAG cell은 해당 칩의 한 단자와 대응됨 • JTAG cell의 연결은 긴 shift-register를 형성함 칩 cell JTAG connector 입력 출력 target 보드
Debug Monitor • target 시스템의 ROM에 상주하는 디버깅 소프트웨어 • host 시스템의 debugger는 serial 혹은 Ethernet 포트를 통하여 target 시스템의 debug monitor와 통신한다 • debug monitor가 host에 제공하는 디버깅 기능 • target의 memory 및 register 값 변경 • program의 수행 • breakpoint의 설정
ROM Emulator • target 시스템의 ROM 소켓을 host의 serial, Ethernet 혹은 USB 포트에 연결하여 host에서 target 시스템의 ROM을 대치하는 memory를 제공 - target 시스템의 통신 포트를 사용 않음 • ROM emulator가 제공하는 디버깅 기능 • memory 및 register의 값을 변경 • breakpoint 설정 • single step 수행
In-Circuit Emulator (ICE) • target 보드의 프로세서 및 memory 등을 대체하여 실험할 수 있는 디버깅 도구 - ICE에 내장된 프로세서와 memory 사용 • target 시스템 프로세서 및 memory에 문제가 있을 때에도 시스템을 실행시켜 개발하면서 디버깅할 수 있음 • memory 대체, 실행 제어, 추적 기능을 밀접하게 연결시켜 최상의 디버깅 능력을 제공함
Gdb - GNU Debugger • Gdb(GNU Debugger)는 어떤 프로그램이 수행되는 도중 그 프로그램 내에서 어떤 일이 일어나는 지를 볼 수 있게 해 준다 • 프로그램을 수행시킨다 • 어떤 특별한 조건에서 프로그램의 수행을 stop시킨다 • 프로그램이 stop된 상태에서 그 프로그램의 내부를 볼 수 있다 • 프로그램의 일 부분을 수정한다 • stop된 프로그램을 continue시킨다
Gdb - 시작 및 종료 • 디버깅 하기 위한 컴파일 옵션 • $ gcc -g prog.c • Gdb 시작 - Gdb prompt "(gdb)" 가 나옴 • $ gdb prog • 특정 프로그램을 디버깅 한다 • $ gdb prog core • 특정 프로그램 및 core 파일을 디버깅 한다 • $ gdb prog pid • 현재 수행 중인 프로그램(프로세스 번호)를 디버깅 한다 • $ gdb --args prog arg1 arg2 ... • 인수를 사용하는 프로그램을 디버깅 한다 • Gdb 종료 • quit 혹은 q 혹은 ^D
Gdb - 프로그램 run • 프로그램 run • run 혹은 r • 인수 주면서 프로그램 run • run arg1 arg2 ... • 이미 수행 중인 프로세스 디버깅 시작 및 종료 • attach pid • detach
Gdb - breakpoint 설정 • 특정 함수에 breakpoint 설정 • break function혹은 break filename:function • 프로그램 소스 줄에 breakpoint 설정 • break linenum혹은 break filename:linenum • 현재 위치에서 상대적 위치에 breakpoint 설정 • break +offset혹은 break -offset • 조건 breakpoint 설정 • break ... if cond • breakpoint 설정 지점 보기 • info breakpoints 참고: breakpoint는 프로그램의 수행을 stop시키는 지점
Gdb - watchpoint 설정 • 프로그램에 의하여 expr이 써지면(write) breakpoint 형성 • watch expr • 프로그램에 의하여 expr이 읽혀지면(read) breakpoint 형성 • rwatch expr • expr이 써지거나(write) 혹은 읽혀지면(read) breakpoint 형성 • awatch expr • 설정된 watchpoint 보기 • info watchpoints 참고: watchpoint는 특정 식의 값이 변경되거나 읽혀질 때 프로그램의 수행이 stop하는 특별한 breakpoint임
Gdb - continue, step, until, finish • stop된 프로그램의 수행 • continue [ignore-count] • c [ignore-count] • stop된 프로그램의 한 단계 수행 • step • step count • 프로그램의 특정 지점까지 수행하고 stop • until location • u location • 현재 수행 중인 함수의 수행을 끝내고 stop • finish
Gdb - 스택 보기 • 스택 전체 보기 • backtrace 혹은 bt • backtrace n 혹은 bt n • 스택 프레임의 선택 • up n // 오래된 프레임 방향으로 • down n // 최근 프레임 방향으로 • 현재 선택된 프레임 정보 보기 • info frame • info f
Gdb - 소스 파일 점검 • 소스 라인 프린트 • list linenum • list function • list • list - • 소스 파일 편집 • edit number • edit filename:number • edit function • edit filename:function
Gdb - 데이터 값 보기 • expression 값 보기 • print expr • print /f expr // /f는 format(예: /d /o /x) • 메모리 값 보기 • x addr • x /nfu addr // n은 갯수, f는 format, u는 단위(예: b, h. w) • register 값 보기 • info registers // register 이름 보기(floating-point 제외) • info all-registers // register 이름 보기 • print $register
Gdb - symbol table 보기 • 심볼 주소 보기 • info address symbol • 주소에 있는 심볼 이름 보기 • info symbol address • expression의 type 보기 • ptype expr • 어떤 함수 내의 모든 심볼 이름 보기 • info scope function
Gdb - 프로그램 수정 • 변수 값 수정 • print x=4 • 다른 곳으로 jump • jump linespec • jump *address • 프로그램에 signal 보내기 • signal signal • 함수 부르기 • call expr • 함수에서 return • return expr
Gdb - remote debugging 환경 • target - gdbserver 및 디버깅할 프로그램의 binary 필요 $ gdbserver host:port prog ... $ gdbserver /dev/ttya prog ... • host - gdb 및 디버깅할 프로그램의 binary(unstripped) 필요 $ gdb (gdb) file prog (gdb) target remote host:port혹은 target remote /dev/ttya (gdb) ...