Chapter 4 Debugging Techniques #2 20047044 김희자 20047045 손재락.

Slides:



Advertisements
Similar presentations
1 구조체 윤 홍 란 컴퓨터 프로그래밍 2 구조체 정의  구조체란 ? o 서로 다른 형의 변수들을 하나로 묶어주는 mechanism. (cf. 배열 : 같은 형의 변수들을 하나로 묶어주는 mechanism) o 예 : 카드의.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
컴퓨터와 인터넷.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
Linux/UNIX Programming
5장. Enhanced Char Driver Operations 과제
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
제3장 C 프로그래밍 환경.
Database Laboratory, Hong Ik University
코크파트너 설치 가이드 Window 7.
Power Java 제3장 이클립스 사용하기.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
공유메모리 int shmget(key_t key, size_t size, int permflags);
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
제 09 장 데이터베이스와 MySQL 학기 인터넷비즈니스과 강 환수 교수.
-Part2- 제3장 포인터란 무엇인가.
PHP입문 Izayoi 김조흔.
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
제9장 C 프로그래밍 환경 창병모
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
07. 디바이스 드라이버의 초기화와 종료 김진홍
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
C 프로그래밍.
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
18강. 데이터 베이스 - II JDBC 살펴보기 Statement객체 살펴보기 Lecturer Kim Myoung-Ho
Sungkyunkwan University OS Project Dongkun Shin
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
TCP/IP Socket Programming…
14장. 포인터와 함수에 대한 이해.
10장. 예외처리.
AVR – ATmega103(ATMEL) Compilers & ISP
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
Linux/UNIX Programming
리눅스 시스템 & 커널 기초 P.46 – P.53 이름: nsh009 학번: 112 1/20.
Seoul National University
Device Driver 임베디드 시스템 I.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
* 프로그램을 간단히 하기 위해 malloc 성공체크는 안 함
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
자바 5.0 프로그래밍.
LabVIEW WiznTec 주임 박명대 1.
제9장 C 프로그래밍 환경 TOPCIT (Test of Practical Competency in IT)
Linux/UNIX Programming
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
( Windows Service Application Debugging )
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
GDB - GNU Debugger 김진용.
3. 모듈 (5장. 모듈).
발표자 : 이지연 Programming Systems Lab.
3.2 분기 명령어.
구조체(struct)와 공용체(union)
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
06. 디바이스의 등록과 해제 김진홍
CODE INJECTION 시스템B 김한슬.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
20 XMLHttpRequest.
Presentation transcript:

Chapter 4 Debugging Techniques # 김희자 손재락

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 2 목차 시스템 폴트 메시지 ddd 을 이용한 디버깅

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 3 시스템 폴트 메시지

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 4 시스템 폴트 드라이버에 버그가 남아있으면 드라이버가 수행될 때 시스템 폴트가 발생할 수 있음 폴트는 현 프로세스를 파괴하지만 시스템은 계속 수행될 수 있음 폴트가 프로세스의 문맥 밖에서 일어나거나 시스템의 핵심 적인 부분을 손상시킨다면 시스템이 붕괴될 수 있음 이 때, 유일하게 불가능한 손상은 이 프로세스의 문맥에 할 당된 일부 메모리를 잃어버리는 것임 열려있는 디바이스는 어떤 방법으로든 커널이 close 동작을 호출하기 때문에 드라이버가 open 메쏘드로 할당한 것은 모 두 해제할 수 있음

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 5 Oops 메시지 1/6 대부분 NULL 포인터 참조나 부정확한 포인터 값을 사용했을 때 발생 프로세서가 사용하는 주소는 모두 “ 가상 ” 주소 잘못된 포인터를 참조했을 때, 페이징 메커니즘은 이 포인터를 물 리 주소로 매핑하는 것에 실패하게 되고 프로세서는 운영체제에게 “ 페이지 폴트 ” 신호를 발생시킴 폴트를 일으키는 디바이스 노드는 버퍼의 경계를 넘는 읽기 시도 를 하면서 사용자 공간에 데이터를 전달하려고 하고 이 동작을 수 행하기 위해 모듈의 페이지를 넘어 데이터를 읽는 순간 페이지 폴 트가 발생 Oops 는 CPU 레지스터의 내용, 페이지 디스크립터 테이블의 위 치, 폴트가 일어났을 때의 프로세서 상태, 여러가지 문제있는 정보 표시 Oops 는 사용자 공간에서의 segmentation fault 와 비슷

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 6 Oops 메시지 2/6 Oops 메시지를 발생시키기 위해 널 포인트를 참조하 게 skull 프로그램을 수정한다. skull]# vi skull_init.c -> L.155 수정, base = ISA_REGION_BEGIN; skull]# make skull]# insmod skull.o Warning: loading skull.o will taint the kernel: no license See for information about tainted modules Segmentation fault

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 7 Oops 메시지 3/6 skull]# lsmod Module Size Used by Tainted: P skull (initializing) skull]# cat /proc/ioports f : dma f : pic f : timer f : keyboard f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : fpu : ide1 01f0-01f7 : ide0

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 8 Oops 메시지 4/6 -> 위에 이어서 skull]# cat /proc/ioports f : l f : l 02a0-02af : l 02b0-02bf : l 02c0-02cf : l 02d0-02df : l 02e0-02ef : l 02f8-02ff : serial(auto) : ide1 03c0-03df : vga+ 03f6-03f6 : ide0 03f8-03ff : serial(auto).  skull 이 할당되지 않음을 볼 수 있다.

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 9 Oops 메시지 5/6 skull]# vi /var/log/messages Warning: loading skull.o will taint the kernel: no license See 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 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 = 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: Feb 15 22:16:07 linuxtest kernel: eax: ebx: ffffffea ecx: edx: Feb 15 22:16:07 linuxtest kernel: esi: edi: 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)

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 10 Oops 메시지 6/6 Feb 15 22:16:07 linuxtest kernel: Stack: ffffffff ffffffea cc85f000 c011e7cd Feb 15 22:16:07 linuxtest kernel: cc85f cfc e d cc85f060 Feb 15 22:16:07 linuxtest kernel: cc85f37c f c700cea0 c6dde000 c cc 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 d8 f7 d f  Oops 메시지 문제점 : 16 진수 값을 프로그래머가 이해하기 힘들다.

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 11 Oops 메시지의 유틸리티 ksymoops Oops 메시지에 있는 주소 값을 커널 심볼로 변환해 줌 유용한 정보는 프로세서 - 의존적이기 때문에 각각의 컴퓨터 아키텍처는 자신의 메시지 포맷을 가지고 있음 시스템 콜 추적 내용과 프로그램 코드를 원래의 oops 메시 지보다 훨씬 이해하기 간편한 형태로 출력 RedHat 9.0 에서는 이 툴이 제외되었음 klogd 와 syslogd 는 console_loglevel 에 상관없이 /var/log/message 파일에 출력됨 Oops 메시지는 위와 같음을 볼 수 있다.

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 12 ddd 를 이용한 디버깅

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 13 ddd(data display debugger) 그래픽 인터페이스를 이용한 디버깅 디버깅 기능 보통 디버깅 소스 파일을 한 줄씩 실행 중단점 (breakpoint), 감시점 (watchpoint) 설정 프로그램 변수 값 변경 장점 자료구조를 그림으로 보여줌 여러 소스 파일을 자동으로 전환하는 능력 다른 백앤드 디버거를 지원  ddd 가 gdb 외에 perl 스크립트 언어의 디버거, sun 의 java 디버거 등과도 동작할 수 있음 여러 언어 지원  C, C++, Objective C, Fortran, Java 등

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 14 ddd 설치 공식 홈페이지 소스 받기 ddd 설치 ddd]# tar xzvf ddd tar.gz ddd-3.3.9]#./configure ddd-3.3.9]# make ddd-3.3.9]# make install

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 15 ddd 를 이용한 간단한 디버깅 1/9 컴파일 및 실행 ddd]# gcc -g fac.c -o fac 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); }

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 16 ddd 를 이용한 간단한 디버깅 2/9 File->Open Program

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 17 ddd 를 이용한 간단한 디버깅 3/9 Breakpoint 설정

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 18 ddd 를 이용한 간단한 디버깅 4/9 Breakpoint 설정되고 Run 실행

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 19 ddd 를 이용한 간단한 디버깅 5/9 Step 으로 실행 - 함수가 호출될 때 함수 안으로 들어가서 코드 한 줄씩 실행 Next - 함수 호출 무시하고 소스 한 줄씩 실행

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 20 ddd 를 이용한 간단한 디버깅 6/9 Step 실행

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 21 ddd 를 이용한 간단한 디버깅 7/9 변수 num 의 값 확인

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 22 ddd 를 이용한 간단한 디버깅 8/9 변수 num 의 값 확인

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 23 ddd 를 이용한 간단한 디버깅 9/9 변수 num 의 값 확인 Kill : 디버깅 종료

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; } 컴파일 및 실행 ddd]# gcc -g list.c -o list ddd]# ddd&

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 25 ddd 를 이용하여 자료구조 보기 2/9 1. 파일 오픈 2.Breakpoint 설정 3.Step 실행 4.Start 포인터 변수 보기

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 26 ddd 를 이용하여 자료구조 보기 3/9 Start 포인터 변수 보기

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 27 ddd 를 이용하여 자료구조 보기 4/9 for 문 1 번 수행후 temp 포인터 변수 확인

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 28 ddd 를 이용하여 자료구조 보기 5/9 1. for 문 2 번 수행 후 temp 포인터 변수가 자동으로 바뀜 2. Prev 를 Display 하여 가리키고 있는 주소를 확인

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 29 ddd 를 이용하여 자료구조 보기 6/9

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 30 ddd 를 이용하여 자료구조 보기 7/9 포인터가 가리키 주소를 그림으로 확인

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 31 ddd 를 이용하여 자료구조 보기 8/9 최종 결과

C S 순천향대학교 정보기술공학부 컴퓨터시스템 연구실 32 ddd 를 이용하여 자료구조 보기 9/9 최종 결과