Download presentation
Presentation is loading. Please wait.
1
Page 1 WDB 를 사용한 프로그램 디버깅 2002. 2. 21 강사 : 이 욱준 차장 HPCS/SDO/MC
2
Page 2 Agenda 디버깅 개요 디버거 개요 WDB 소개 및 History WDB 사용법 디버깅 예 디버깅 팁 Q & A
3
WDB Page 3 디버깅 이란 ? 프로그램 작성중 발생한 에러의 근본 원인을 찾아내고 고치는 일련의 프로세스 프로젝트 기간의 50% 까지 차지할 수 있다. 코드의 안정성과 완벽함을 높이는 필수적인 작업이다.
4
WDB Page 4 디버깅 테크닉 툴의 사용 wdb, gdb, adb 프로그램 review printf() 문의 삽입 의도된 동작을 일으켜 원인 추측 특정 실행 경로의 조사 System call trace : tusc
5
WDB Page 5 디버거 란 ? 디버거는 실행중인 프로그램의 상태를 확인할 수 있는 툴이다. 디버거는 프로그램상의 오류를 발견하고 고칠 수 있게 해주는 도구이다.
6
WDB Page 6 일반적인 디버거 기능 프로그램 실행 breakpoint 에서 프로그램의 정지 한번에 한 라인씩 실행 변수의 값 출력 signal 처리
7
WDB Page 7 WDB 란 ? HP WDB 는 GDB 디버거를 HP 상에서 구현한 디버거 이다. WDB 는 오브젝트 파일의 소스레벨 디버깅을 지원하며, HP-UX 10.20 이상의 HP C, HP aC++, Fortran 90, 및 FORTRAN77 에서 사용 가능하다. HP WDB 3.x 은 HP-UX 10.20, 11.0 및 11.11 시스템에서 권장하는 디버거이다. HP WDB 1.3.x 은 HP-UX 11.20 또는 그 이후 버전에서 동작하는 Itanium 기반의 시스템에서 권장하는 디버거이다. HP DDE 나 xdb 와 같은 디버거는 향후 출시되는 HP- UX 에서는 지원되지 않을 수 있다.
8
WDB Page 8 WDB History - pre-wdb <1992 HP-UX xdb 를 대체하기 위한 HP-UX, Motif 에 포팅된 HP 고유의 디버거 (DDE) 공유 라이브러리, 디버그 형식 등에 HP 고유의 인터페이스 사용 PA-RISC 1.1 GNU: FSF 에서 만든 gcc, gdb, emacs, hurd,…free source... GNU/Linux: Minix 와 공존한 초기 OS 0.1 은 FSF component 및 POSIX 인터페이스 사용 …open source... GNU/HP-UX: gcc/gdb 가 HP platform 에서 작동
9
WDB Page 9 WDB History - ~ 1995 DDE 가 xdb 를 대체 못함, 수정하기 위한 많은 노력... 경쟁사 분석 DDE vs. Sun, SGI, Totalview, IBM, Microsoft… 기존 아키텍쳐의 한계 : 복잡성 ; 예 ) optimize 된 코드의 디버그, parallelism, 분산 프로그램... IA-64 아키텍쳐... 개선하기 힘든 사항 ; 예 ) 성능 … 결론 : 새로운 디버거의 탄생 시기 도래 및 & 새로운 아키텍쳐의 대두 높은 수준의 요구 사항 영향 분석 ; gdb: 기능의 분리 ; reasonable C/C++; robust; 친숙한 인터페이스 gdb 의 결여 사항 : GUI, 64- bit, Fortran, parallelism,...
10
WDB Page 10 WDB History – 1997 ~ wdb 0.75; HP 컴파일러 지원 ; aCC, exceptions,... HP shared library 지원 HP-UX: hw watchpoints, kernel threads, … xdb 와 호환성 제공 : -tui -xdb wdb 1.0; Fortran 64-bit; PA-RISC 2.0 +objdebug link times wdb 1.1; user-space thread 지원 gdb 4.17 과 통합 GUI 인터페이스 wdb 1.2; 새로운 “signal” 및 “Debugger Preferences” 다이알로그 새로운 Recent Files menu 를 사용한 소스파일 간의 빠른 전환 wdb 2.0; 프로그램 즉시 수정 기능 메모리 점검 기능 함수의 소스 보기 기능 프로그램 콘솔의 xterm 지원 wdb 2.1; gdb 5.0 을 기반으로 함. 50% 빠른 로드 속도 incrementally linked 64-bit 프로그램의 디버깅 지원 wdb 3.0; 메모리 leak detection 및 heap 분석 기능 (run-time checking (RTC)) 의 기능 강화 large core 파일 (> 2GB) 의 디버깅 지원. Java/C/aCC stack unwinding 지원 4.16 4.17 5.0
11
WDB Page 11 WDB 코맨드 - wdb 의 기동 및 정지 cc -g sourcefile.c -g 옵션은 gdb 가 필요한 모든 정보를 제공한다. wdb filename `filename' 은 실행 파일의 이름이다. wdb 를 멈추려면, `q‘ (quit) 를 입력한다.
12
WDB Page 12 WDB 코맨드 – 초화면
13
WDB Page 13 WDB 코맨드 - wdb 상에서 프로그램 실행 r command = run command, 해당 프로그램을 실행한다. Command-line argument 가 있으면 같이 기술해 준다. 만약 프로그램을 아래와 같이 실행하면 : a.out < z, gdb 에서 아래와 같이 입력한다. r < z
14
WDB Page 14 WDB 코맨드 – 소스 보기 l command = list command. 소스 파일의 내용을 참조할 때 사용한다. 52 라인부터 파일의 내용을 표시하려면 : One source file: l 52 More sources: l X.c:52 함수명을 지정하면, 해당 함수의 첫번째 라인부터 표시한다.
15
WDB Page 15 WDB 코맨드 – 소스 보기 화면
16
WDB Page 16 WDB 코맨드 - Breakpoints b command = breakpoint command. 30 라인에서 프로그램을 멈추려면 : One source: b 30 More sources: b X.c:30 프로그램의 실행을 계속하려면, `c' (continue command) 를 입력한다.
17
WDB Page 17 WDB 코맨드 - Breakpoints 해당 함수 앞에서 프로그램을 멈추려면 : One source: b my_fun disable command 를 사용하여 breakpoint 를 취소할 수 있다 : disable 3 enable command 를 사용하여 breakpoint 를 re-enable 할 수 있다 : enable 3 모든 breakpoint 의 정보를 보려면 : info breakpoints
18
WDB Page 18 WDB 코맨드 – Breakpoints 화면
19
WDB Page 19 WDB 코맨드 - Display / Print disp command = display command. 프로그램이 멈출 때마다 지정한 변수 및 수식을 표시한다. p command = print command. 지정한 변수 및 수식을 한번만 표시한다. int I,J,X[50]; disp X[12*I+J] - 20 p i
20
WDB Page 20 WDB 코맨드 - Display / Print gdb 에서 struct 변수를 출력하면, 구조체의 각각의 필드가 출력될 것이다. 만약 array 를 선택하면, 모든 array 값이 출력된다. undisplay command 를 사용하여 disp command 에서 설정한 것을 취소할 수 있다.
21
WDB Page 21 WDB 코맨드 - Display / Print int G; p G 는 아래의 표현식과 동일하다 : printf("%d\n",G); p /x G 는 아래의 표현식과 동일하다 : printf("%x\n",G);
22
WDB Page 22 WDB 코맨드 - Display / Print 화면
23
WDB Page 23 WDB 코맨드 - Next / Step n command = next command s command = step command 함수 앞에서 `s' 코맨드를 사용하면, 파라미터의 값도 알 수 있다.
24
WDB Page 24 WDB 코맨드 - Backtracking bt command = backtracking command 실행 도중 ``bus error'' 나 ``segmentation fault'‘ 와 같은 에러 메시지가 나올 경우, `bt' command 를 사용하면 프로그램의 어디에서 위의 문제가 발생했는지, 그리고 함수 안에서 발생했으면, 어디에서 해당 함수를 불렀는지 알 수 있다. 이런 정보는 디버깅시 매우 유용하게 사용할 수 있다.
25
WDB Page 25 WDB 코맨드 - Kill kill command: gdb 에서 실행중인 프로그램을 종료 시킨다. 예를 들면, gdb 가 기존 실행파일을 잡고 있으면 프로그램의 재컴파일시 에러가 발생하는데, 이런 경우에 사용할 수 있다.
26
WDB Page 26 디버깅 예 – Input/Output 프로그램 실행시 입력 / 출력이 필요할 때, 프로그램 콘솔 창을 사용한다.
27
WDB Page 27 디버깅 예 – Core Dump Core Dump 란 ? HP-UX 시스템은 특정 signal 을 받을 경우에 해당 프로세스의 이미지를 파일로 작성한다. 이때, 이 이미지는 이상종료시의 프로그램 상태를 가지고 있다. 대부분의 경우, memory violation, illegal instruction, floating point exception, bus error 및 사용자의 quit signal 에 의해 발생한다. post-mortem 으로 아래와 같이 소스코드를 디버깅할 수 있다 : wdb executable-file core-file
28
WDB Page 28 디버깅 예 – Multi Thread 프로그램 Thread 란 ? 프로세스 안에서 독자적으로 존재하는 제어의 흐름으로, context (register set 및 프로그램 counter 포함 ) 및 실행할 일련의 명령어로 구성되어 있다. 모든 thread 에 대해 bt 코맨드를 실행하려면 : thread apply all bt Thread 2 번의 변수 i 의 값을 보려면 : thread apply 2 p i 1 번 thread 로 전환하려면 : thread 1
29
WDB Page 29 디버깅 예 – Memory leak Memory leak 이란 ? Leak 이란 프로그램에서 데이터 영역을 할당하였지만 free 하지 않고, 프로그램에서도 더 이상 사용하지 않는 것을 말한다. 일반적으로 해당 데이터 영역에 대한 포인터가 없어서 free 할 수 없는 경우, 또는 해당 메모리가 사용 가능하지만 프로그램 상에서 재사용하지 않는 경우이다. 모든 경우에 메모리의 낭비가 있다.
30
WDB Page 30 디버깅 예 – Memory leak 확인 방법 – batch 모드 32-bit 프로그램의 경우, /opt/langtools/lib/librtc.a 를 link. 64-bit 프로그램의 경우, /opt/langtools/lib/pa20_64/librtc.a 를 link. C 라이브러리 및 core 라이브러리의 아카이브 버전 (/usr/lib/libc.a, /usr/lib/libcl.a) 을 사용중이면, 상응하는 shared 버전으로 변경한다. 해당 어플리케이션을 –lcl 옵션을 사용하여 core 라이브러리와 link 한다. 프로그램 실행 /tmp/gdbrtc.log 파일을 확인하여, memory leak 이 발생했는지 검사한다.
31
WDB Page 31 디버깅 예 – Memory leak 확인 방법 – interactive 모드 32-bit 프로그램의 경우, /opt/langtools/lib/librtc.sl 를 link. 64-bit 프로그램의 경우, /opt/langtools/lib/pa20_64/librtc.sl 를 link. C 라이브러리 및 core 라이브러리의 아카이브 버전 (/usr/lib/libc.a, /usr/lib/libcl.a) 을 사용중이면, 상응하는 shared 버전으로 변경한다. wdb 기동 후, “set heap-check leaks on“ 코맨드를 실행한다. Breakpoint 를 사용하여 어플리케이션을 정지시킨 후, “info leaks” 코맨드를 사용하여 내용을 확인한다.
32
WDB Page 32 디버깅 팁 – Abort Signal Abort Signal 을 보면 문제의 원인을 알 수 있다. SIGBUS: NULL pointer 의 사용 가능성 SIGSEGV: pointer 의 사용 오류, 잘못된 코드 영역으로의 쓰기 오류, 또는 데이터 영역으로의 분기 오류 가능성 SIGFPE: 0 으로 나누기 오류
33
WDB Page 33 Q & A
34
Page 34 Thanks
Similar presentations