공개 SW 기술지원센터

Similar documents
슬라이드 1

Microsoft PowerPoint - chap01-C언어개요.pptx

강의10

BMP 파일 처리

11장 포인터

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2


PowerPoint 프레젠테이션

리눅스 취약점대응방안권고 / KISA 취약점점검팀 영향받는플랫폼 OS, FAQ 추가 개요 미국보안회사 에의해 시스템의 라이브러리 의특정함수에서임의코드를실행할수있는취약점이공개 해당취약점은 CVE 지정, 도메인네임을

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

vi 사용법

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

PowerPoint 프레젠테이션

Microsoft PowerPoint - System Programming Lab Week1.ppt [호환 모드]

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap-02.pptx

본 강의에 들어가기 전

Microsoft PowerPoint - o8.pptx

DCL Debugging Support

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1

Æí¶÷4-¼Ö·ç¼Çc03ÖÁ¾š

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Microsoft PowerPoint - chap03-변수와데이터형.pptx

11장 포인터

untitled

<4D F736F F F696E74202D204C BAB8C3E6BCB3B8ED202D20C7C1B7CEB1D7B7A1B9D6C0DBBCBAB0FAC1A42C C F>

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap-02.pptx

금오공대 컴퓨터공학전공 강의자료

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

Microsoft PowerPoint - CSharp-10-예외처리

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - chap06-5 [호환 모드]

chap 5: Trees

PowerPoint 프레젠테이션

C++-¿Ïº®Çؼ³10Àå

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap12-고급기능.pptx

Frama-C/JESSIS 사용법 소개

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

6주차.key

Microsoft PowerPoint - chap11-포인터의활용.pptx

vi 사용법

untitled

Microsoft PowerPoint - lab14.pptx


untitled

chap10.PDF

JVM 메모리구조

Microsoft PowerPoint APUE(Intro).ppt

PowerPoint 프레젠테이션

untitled

PowerPoint 프레젠테이션

임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈

untitled

11장 포인터

PA for SWE2007

2007_2_project4

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap-11.pptx

Infinity(∞) Strategy

Microsoft Word - FunctionCall

OCW_C언어 기초

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

OCW_C언어 기초

PowerPoint Presentation

Microsoft PowerPoint - chap6 [호환 모드]

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - C++ 5 .pptx

슬라이드 1

C 프로그래밊 개요

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Chapter 4. LISTS

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

PowerPoint Presentation

Microsoft Word - KPMC-400,401 SW 사용 설명서

8장. 포인터

gnu-lee-oop-kor-lec06-3-chap7

Transcription:

- 1 -

일자 VERSION 변경내역작성자 2007. 8. 29 0.1 초기작성김상운 - 2 -

구분 : 기업대기관작성자 : 김상운검토자 : 허종윤승인자 : 박훈성 단계 : 완료작성일 : 2007년 8 월 29 일작성일 : 2007년 8 월 29 일작성일 : 2007년 8 월 29 일 1. 인증지원기관정보 구분 항목 내용 비고 지역 경기도군포시당정동 522 기업 / 기관명칭 유플러스 기업 / 기관부서 SW팀직책책임연구원정보담당자이름박종유 전화번호 / 팩스번호 031-436-2239 E-Mail jypark@upv.co.kr 2. 인증지원사항 구분 항목 내용 비고 자사가개발하고있는리눅스기반의전자액자응용프로그 램에서개발과정에다른리눅스솔루션과호환성을유지하 지원요청사항 기위한디버깅방법론요청 관련디버깅기술중메모리관련디버깅툴과활용예제에 대해서요청 다음과같은리눅스기반의메모리디버깅방법소개 노트북및 PC 호환성검토 지원상세내역 l l MEMWATCH YAMD l Electric Fence 확인사항 리눅스데스크탑 / 서버배포판및관련솔루션과의호환성을 위한개발방법과예제제시 - 3 -

3. 리눅스디버깅기술 * 기반운영체제 :Asianux 2.0 리눅스에서솔루션들을개발하여기존운영체제나관련솔루션들과연동에있어서정확하게동작하고 문제가업는지를판단하기위해개발과정에서반드시디버깅작업이이루어져야한다 여기에서이러한호환성확인을위한여러가지가지디버깅시나리오있지만본문서에서는메모리할 당문제가있는두개의샘플프로그램을사용하여 MEMWATCH 와 Yet Another Malloc Debugger (YAMD) 툴을사용하여디버깅하는방법을언급합니다.. 참고 ) 일반적인디버깅전략프로그램에버그가포함되어있다면대게코드어딘가에있을것이다. 여러분이사실이라고믿는이러한상황은실제로는잘못되었다. 버그를찾는다는것은무엇인가잘못되었다는것을발견할때까지여러분이사실이라고믿는것을다시한번확인하는과정이다. 다음은여러분이사실이라고믿고있는몇가지유형이다. l 소스코드의특정위치에서, 변수는특정값을가진다. l 주어진위치에서, 구조가정확히설정되었다. l if-then-else 문에서 if 부분은실행되었던경로이다. l 서브루틴이호출될때루틴은매개변수를정확히받는다. 버그를찾는것에는이러한모든것들을확인하는과정이포함된다. 특정변수가특정값을갖고있다고믿는다면서브루틴이호출될대이를검사해보라. if 구조가실행된다는것을믿는다면검사해보라. 여러분이가정하는것을확인해보면결국여러분의신념이잘못되었다는것을발견할것이다. 결국여러분은버그의위치를찾게된다. 디버깅은피해갈수없는과정이다. 메시지를스크린에프린팅하기, 디버거사용하기, 프로그램실행에대해생각하기, 문제에대한현학적인고찰하기같이디버깅에대한많은방식들이있다. 버그를픽스하기전에소스의위치부터알아야한다. 예를들어, 세그멘테이션오류가있을경우, 코드의어떤라인에서 seg 오류가발생했는지를알아야한다. 문제의코드라인을찾아내면그메소드에서의변수의값, 메소드가호출되었던방법, 에러가발생했던이유등을파악하라. 디버거를사용하면이모든정보를찾기가쉬워진다. 디버거를사용할수없다면다른툴들도있다. ( 제품환경에서는디버거를사용하지못할수도있다. 리눅스커널에는디버거가빌트인되어있지않다.) 여기에서는코드를육안으로검사해서는찾기어려운문제들과, 매우드문환경에서발생하는문제유형에대해살펴보도록하겠다. 환경이결합될때에만발생하는에러가있고, 프로그램을전개한후에만메모리버그를발견할때가가끔있다 - 4 -

메모리디버깅툴에대해서 리눅스시스템상의표준프로그래밍언어로서 C 언어는동적메모리할당에대한많은제어권을제공한다. 하지만이러한자유가중대한메모리관리문제를야기시키고이문제는프로그램충돌또는강등으로이어진다. 메모리누수 (malloc() 메모리가상응하는 free() 호출로결코누출되지않는다.) 와버퍼오버런 ( 어레이에할당되었던지난메모리작성하기 ) 은공통의문제들이고탐지하기어렵다. 이섹션에서는메모리문제를탐지하고고립하는몇가지디버깅툴에대해알아보겠다. MEMWATCH Johan Lindh가작성한 MEMWATCH는다운로드가능한 C를위한오픈소스메모리에러탐지툴이다.( 참조자료 ) 헤더파일을코드에추가하고 gcc 문에 MEMWATCH를정의하면프로그램에메모리누수와오염을탐지할수있다. MEMWATCH는 ANSI C를지원하고, 결과로그를제공하고, 중복도없고에러도없는실행하지않는메모리와오버플로우와언더플로우를탐지한다. #include <stdlib.h> #include <stdio.h> #include "memwatch.h" int main(void) { char *ptr1; char *ptr2; ptr1 = malloc(512); ptr2 = malloc(512); } ptr2 = ptr1; free(ptr2); free(ptr1); 위의코드는두개의 512- 바이트메모리블록을할당하고첫번째블록에대한포인터가두번째블 록에설정된다. 결과적으로두번째블록의주소가소실되고메모리누수가생긴다. 이제 memwatch.c 를컴파일한다. 다음은 makefile 예제이다. gcc -DMEMWATCH -DMW_STDIO test1.c memwatch c -o test1-5 -

test1 프로그램을실행하면누수된메모리리포트가만들어진다. 다음의내용은 memwatch.log 출 력파일예제이다. MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14) unfreed: <2> test1.c(11), 512 bytes at 0x80519e4 {FE FE FE FE FE FE FE FE FE FE FE FE..} Memory usage statistics (global): N)umber of allocations made: 2 L)argest memory usage : 1024 T)otal of all alloc() calls: 1024 U)nfreed bytes totals : 512 MEMWATCH 는문제가있는실제라인을제공한다. 이미제거된포인터를제거하면알려준다. 제거되 지않은메모리에도똑같이적용된다. 로그의끝에있는섹션은얼마나많은메모리가누수가있었는 지, 얼마나많이사용되었는지, 총할당량은어느정도인지를디스플레이한다. YAMD Nate Eldredge가작성한 YAMD 패키지는 C와 C++ 에서메모리할당과관련문제들을찾는다. 이글을쓰고있는현재최신버전의 YAMD는 0.32이며. yamd-0.32.tar.gz를다운로드하여 make 명령어를실행하여프로그램을구현한다음 make install 명령어를사용하여프로그램을설치하고툴을설정한다. YAMD 를다운로드한후에다음과같이앞에서작성한 test1.c 에서이것을사용한다. #include memwatch.h 를제거하고 makefile 을다음과같이변경한다. YAMD 를사용한 test1 gcc -g test1.c -o test1 다음의내용은 test1 상에서의 YAMD 의결과물이다. - 6 -

YAMD version 0.32 Executable: /usr/src/test/yamd-0.32/test1 INFO: Normal allocation of this block Address 0x40025e00, size 512 INFO: Normal allocation of this block Address 0x40028e00, size 512 INFO: Normal deallocation of this block Address 0x40025e00, size 512 ERROR: Multiple freeing At free of pointer already freed Address 0x40025e00, size 512 WARNING: Memory leak Address 0x40028e00, size 512 WARNING: Total memory leaks: 1 unfreed allocations totaling 512 bytes *** Finished at Tue 10:07:15 2002 Allocated a grand total of 1024 bytes 2 allocations Average of 512 bytes per allocation Max bytes allocated at one time: 1024 24 K alloced internally / 12 K mapped now / 8 K max Virtual program size is 1416 K End. YAMD 는우리가이미프로그램을메모리를제거했어도메모리누수가있다는것을알려준다. 또다른 아래의예제프로그램에서 YAMD 를실행해보자. - 7 -

#include <stdlib.h> #include <stdio.h> int main(void) { char *ptr1; char *ptr2; char *chptr; int i = 1; ptr1 = malloc(512); ptr2 = malloc(512); chptr = (char *)malloc(512); for (i; i <= 512; i++) { chptr[i] = 'S'; } ptr2 = ptr1; free(ptr2); free(ptr1); free(chptr); } 그런다음다음명령어를사용하여 YAMD 를시작한다../run-yamd /usr/src/test/test2/test2 위의에제프로그램에서 YAMD 를사용한결과는아래의 out of bound 조건을갖고있다는것을말해준다. 내용과같다. YAMD 는 for 루프에서우리가 - 8 -

Running /usr/src/test/test2/test2 Temp output to /tmp/yamd-out.1243 *********./run-yamd: line 101: 1248 Segmentation fault (core dumped) YAMD version 0.32 Starting run: /usr/src/test/test2/test2 Executable: /usr/src/test/test2/test2 Virtual program size is 1380 K INFO: Normal allocation of this block Address 0x40025e00, size 512 INFO: Normal allocation of this block Address 0x40028e00, size 512 INFO: Normal allocation of this block Address 0x4002be00, size 512 ERROR: Crash Tried to write address 0x4002c000 Seems to be part of this block: Address 0x4002be00, size 512 Address in question is at offset 512 (out of bounds) Will dump core after checking heap. Done. MEMWATCH 와 YAMD 모두유용한디버깅툴이고다른접근방식이필요하다. MEMWATCH 를사용해 서는 include 파일인 memwatch.h 에추가하고두개의컴파일타임플래그를켜야한다. YAMD 는 link 문에 -g 옵션만필요했다. - 9 -

Electric Fence 대부분의리눅스배포판에는 Electric Fence용패키지가포함되어있지만다운로드할수도있다. Electric Fence는 Bruce Perens가작성한 malloc() 디버깅라이브러리이다. 여러분이할당한메모리바로뒤에보호를받는메모리를할당한다. fencepost 에러가있다면 ( 어레이끝에서실행됨 ) 프로그램은프로텍션 (protection) 에러를사용하여즉시종료된다. Electric Fence와 gdb를결합하면어떤라인이보호되는메모리에접근했는지정확히추적할수있다. Electric Fence는메모리누수를탐지할수있다. 4. 참고문서 http://www.ibm.com/developerworks/linux/library/l-debug/ http://www.linkdata.se/sourcecode.html http://www.ibm.com/developerworks/cgi-bin/click.cgi?url=oss.software.ibm.com/developerworks/op ensource/linux&origin=l - 10 -