Download presentation
Presentation is loading. Please wait.
1
Chapter 4 Debugging Techniques #2 20047044 김희자 20047045 손재락
2
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 2 목차 시스템 폴트 메시지 ddd 을 이용한 디버깅
3
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 3 시스템 폴트 메시지
4
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 4 시스템 폴트 드라이버에 버그가 남아있으면 드라이버가 수행될 때 시스템 폴트가 발생할 수 있음 폴트는 현 프로세스를 파괴하지만 시스템은 계속 수행될 수 있음 폴트가 프로세스의 문맥 밖에서 일어나거나 시스템의 핵심 적인 부분을 손상시킨다면 시스템이 붕괴될 수 있음 이 때, 유일하게 불가능한 손상은 이 프로세스의 문맥에 할 당된 일부 메모리를 잃어버리는 것임 열려있는 디바이스는 어떤 방법으로든 커널이 close 동작을 호출하기 때문에 드라이버가 open 메쏘드로 할당한 것은 모 두 해제할 수 있음
5
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 5 Oops 메시지 1/6 대부분 NULL 포인터 참조나 부정확한 포인터 값을 사용했을 때 발생 프로세서가 사용하는 주소는 모두 “ 가상 ” 주소 잘못된 포인터를 참조했을 때, 페이징 메커니즘은 이 포인터를 물 리 주소로 매핑하는 것에 실패하게 되고 프로세서는 운영체제에게 “ 페이지 폴트 ” 신호를 발생시킴 폴트를 일으키는 디바이스 노드는 버퍼의 경계를 넘는 읽기 시도 를 하면서 사용자 공간에 데이터를 전달하려고 하고 이 동작을 수 행하기 위해 모듈의 페이지를 넘어 데이터를 읽는 순간 페이지 폴 트가 발생 Oops 는 CPU 레지스터의 내용, 페이지 디스크립터 테이블의 위 치, 폴트가 일어났을 때의 프로세서 상태, 여러가지 문제있는 정보 표시 Oops 는 사용자 공간에서의 segmentation fault 와 비슷
6
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 6 Oops 메시지 2/6 Oops 메시지를 발생시키기 위해 널 포인트를 참조하 게 skull 프로그램을 수정한다. [root@linuxtest skull]# vi skull_init.c -> L.155 수정, base = ISA_REGION_BEGIN; [root@linuxtest skull]# make [root@linuxtest skull]# insmod skull.o Warning: loading skull.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules Segmentation fault
7
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 7 Oops 메시지 3/6 [root@linuxtest skull]# lsmod Module Size Used by Tainted: P skull 2120 1 (initializing) [root@linuxtest skull]# cat /proc/ioports 0000-001f : dma1 0020-003f : pic1 0040-005f : timer 0060-006f : keyboard 0080-008f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : ide1 01f0-01f7 : ide0
8
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 8 Oops 메시지 4/6 -> 위에 이어서 [root@linuxtest skull]# cat /proc/ioports 0280-028f : l 0290-029f : l 02a0-02af : l 02b0-02bf : l 02c0-02cf : l 02d0-02df : l 02e0-02ef : l 02f8-02ff : serial(auto) 0376-0376 : ide1 03c0-03df : vga+ 03f6-03f6 : ide0 03f8-03ff : serial(auto). skull 이 할당되지 않음을 볼 수 있다.
9
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 9 Oops 메시지 5/6 [root@linuxtest skull]# vi /var/log/messages Warning: loading skull.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules Segmentation fault Feb 15 22:12:46 linuxtest ntpd[1099]: kernel time discipline status change 41 Feb 15 22:13:49 linuxtest ntpd[1099]: kernel time discipline status change 1 Feb 15 22:16:07 linuxtest kernel: Unable to handle kernel paging request at virtual address 20000000 Feb 15 22:16:07 linuxtest kernel: printing eip: Feb 15 22:16:07 linuxtest kernel: cc85f18c Feb 15 22:16:07 linuxtest kernel: *pde = 00000000 Feb 15 22:16:07 linuxtest kernel: Oops: 0000 Feb 15 22:16:07 linuxtest kernel: CPU: 0 Feb 15 22:16:07 linuxtest kernel: EIP: 0010:[ ] Tainted: P Feb 15 22:16:07 linuxtest kernel: EFLAGS: 00010002 Feb 15 22:16:07 linuxtest kernel: eax: 00000000 ebx: ffffffea ecx: 00000001 edx: 00000001 Feb 15 22:16:07 linuxtest kernel: esi: 10000000 edi: 00000000 ebp: c692ff08 esp: c692fef0 Feb 15 22:16:07 linuxtest kernel: ds: 0018 es: 0018 ss: 0018 Feb 15 22:16:07 linuxtest kernel: Process insmod (pid: 1466, stackpage=c692f000)
10
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 10 Oops 메시지 6/6 Feb 15 22:16:07 linuxtest kernel: Stack: 00000206 ffffffff 00000001 ffffffea 00000000 00000000 cc85f000 c011e7cd Feb 15 22:16:07 linuxtest kernel: cc85f060 0808cfc0 000007e8 00000006 00000000 0808d250 00060000 cc85f060 Feb 15 22:16:07 linuxtest kernel: cc85f37c 000002f0 00000060 00000005 c700cea0 c6dde000 c7162000 cc861000 Feb 15 22:16:07 linuxtest kernel: Call Trace: [ ] [ ] [ ] [ ] [ ] Feb 15 22:16:07 linuxtest kernel: [ ] Feb 15 22:16:07 linuxtest kernel: Feb 15 22:16:07 linuxtest kernel: Code: 8a 9e 00 00 00 10 88 d8 f7 d0 88 86 00 00 00 10 f0 83 44 24 Oops 메시지 문제점 : 16 진수 값을 프로그래머가 이해하기 힘들다.
11
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 11 Oops 메시지의 유틸리티 ksymoops Oops 메시지에 있는 주소 값을 커널 심볼로 변환해 줌 유용한 정보는 프로세서 - 의존적이기 때문에 각각의 컴퓨터 아키텍처는 자신의 메시지 포맷을 가지고 있음 시스템 콜 추적 내용과 프로그램 코드를 원래의 oops 메시 지보다 훨씬 이해하기 간편한 형태로 출력 RedHat 9.0 에서는 이 툴이 제외되었음 klogd 와 syslogd 는 console_loglevel 에 상관없이 /var/log/message 파일에 출력됨 Oops 메시지는 위와 같음을 볼 수 있다.
12
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 12 ddd 를 이용한 디버깅
13
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 13 ddd(data display debugger) 그래픽 인터페이스를 이용한 디버깅 디버깅 기능 보통 디버깅 소스 파일을 한 줄씩 실행 중단점 (breakpoint), 감시점 (watchpoint) 설정 프로그램 변수 값 변경 장점 자료구조를 그림으로 보여줌 여러 소스 파일을 자동으로 전환하는 능력 다른 백앤드 디버거를 지원 ddd 가 gdb 외에 perl 스크립트 언어의 디버거, sun 의 java 디버거 등과도 동작할 수 있음 여러 언어 지원 C, C++, Objective C, Fortran, Java 등
14
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 14 ddd 설치 공식 홈페이지 http://www.gnu.org/software/ddd/ 소스 받기 http://ftp.gnu.org/gnu/ddd/ ddd 설치 [root@UPnP1 ddd]# tar xzvf ddd-3.3.9.tar.gz [root@UPnP1 ddd-3.3.9]#./configure [root@UPnP1 ddd-3.3.9]# make [root@UPnP1 ddd-3.3.9]# make install
15
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 15 ddd 를 이용한 간단한 디버깅 1/9 컴파일 및 실행 [root@UPnP1 ddd]# gcc -g fac.c -o fac [root@UPnP1 ddd]# ddd& /* fac.c */ #include int faculty(int num); int main() { int count; int fac; for(count=1; count<10; count++) { fac = faculty(count); printf("count: %u, fac: %u\n", count, fac); } return 0; } int faculty(int num) { if(num = 0) return 1; else return num * faculty(num -1); }
16
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 16 ddd 를 이용한 간단한 디버깅 2/9 File->Open Program
17
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 17 ddd 를 이용한 간단한 디버깅 3/9 Breakpoint 설정
18
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 18 ddd 를 이용한 간단한 디버깅 4/9 Breakpoint 설정되고 Run 실행
19
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 19 ddd 를 이용한 간단한 디버깅 5/9 Step 으로 실행 - 함수가 호출될 때 함수 안으로 들어가서 코드 한 줄씩 실행 Next - 함수 호출 무시하고 소스 한 줄씩 실행
20
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 20 ddd 를 이용한 간단한 디버깅 6/9 Step 실행
21
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 21 ddd 를 이용한 간단한 디버깅 7/9 변수 num 의 값 확인
22
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 22 ddd 를 이용한 간단한 디버깅 8/9 변수 num 의 값 확인
23
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 23 ddd 를 이용한 간단한 디버깅 9/9 변수 num 의 값 확인 Kill : 디버깅 종료
24
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 24 ddd 를 이용하여 자료구조 보기 1/9 /* list.c */ #include int main() { typedef struct person_struct { char* name; int age; struct person_struct *next; struct person_struct *prev; } person_t; person_t *start, *pers, *temp; char *name[] = {"Heeja", "Jaerok", "Jihey"}; int age[] = {30, 31, 32}; int count; start = (person_t*)malloc(sizeof(person_t)); start->name = name[0]; start->age = age[0]; start->prev = NULL; start->next = NULL; pers = start; for(count=1; count<3; count++) { temp = (person_t*)malloc(sizeof(person_t)); temp->name = name[count]; temp->age = age[count]; pers->next = temp; temp->prev = pers; pers = temp; } temp->next = NULL; printf("Data struct created\n"); return 0; } 컴파일 및 실행 [root@UPnP1 ddd]# gcc -g list.c -o list [root@UPnP1 ddd]# ddd&
25
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 25 ddd 를 이용하여 자료구조 보기 2/9 1. 파일 오픈 2.Breakpoint 설정 3.Step 실행 4.Start 포인터 변수 보기
26
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 26 ddd 를 이용하여 자료구조 보기 3/9 Start 포인터 변수 보기
27
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 27 ddd 를 이용하여 자료구조 보기 4/9 for 문 1 번 수행후 temp 포인터 변수 확인
28
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 28 ddd 를 이용하여 자료구조 보기 5/9 1. for 문 2 번 수행 후 temp 포인터 변수가 자동으로 바뀜 2. Prev 를 Display 하여 가리키고 있는 주소를 확인
29
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 29 ddd 를 이용하여 자료구조 보기 6/9
30
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 30 ddd 를 이용하여 자료구조 보기 7/9 포인터가 가리키 주소를 그림으로 확인
31
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 31 ddd 를 이용하여 자료구조 보기 8/9 최종 결과
32
C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 32 ddd 를 이용하여 자료구조 보기 9/9 최종 결과
Similar presentations