준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우...

Post on 27-Feb-2020

0 views 0 download

Transcript of 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우...

i

Windows Embedded CE 6.0

CTSMExam 70-571

전매 금지.

인증 시험 준비준비 키트(Preparation Kit)

R2 콘텐츠로

업데이트

ii

발행인

Microsoft Corporation

One Microsoft Way

Redmond, Washington 98052-6399

이 문서는 정보용입니다 . MICROSOFT 는 이 문서에 포함된 정보에 대해 ( 직접 , 간접 , 특별한 )그 어떤 보증도 하지 않습니다 . 이 문서에 포함된 정보는 발행일을 기준으로 토론된 문제점에 대한 Microsoft Corporation 의 현재 관점을 대표합니다 . Microsoft 는 변하는 시세에 대처해야 하기 때문에 정보에 대한 책임을 질 수 없으며 발행일 이후에 제공되는 정보의 정확성을 보장할 수 없습니다 . URL 과 기타 인터넷 웹사이트 참고 자료를 포함하여 이 문서에 있는 정보는 통보없이 변경될 수 있습니다 .

모든 적용되는 저작권 법을 준수하는 것은 사용자의 책임입니다 . 저작권 하에 권리 제한이 허용되지 않는 한 , Microsoft Corporation 의 명시적 서면 허가없이 이 문서의 그 어느 일부도 그 어떤목적으로든 무단으로 복제 , 검색 시스템으로 저장 또는 입력 , 또는 그 어떤 형태나 방식으로 전송( 전자 , 기계 , 복사 , 기록 , 또는 기타 ) 될 수 없습니다 . Microsoft 는 이 문서상에 언급된 주제에관련된 특허 , 특허 응용 프로그램 , 등록 상표 , 저작권 또는 기타 지적 재산권을 소유할 수 있습니다 . Microsoft 와의 서면 사용권 계약에 명시적으로 나타나 있지 않은 이상 , 이 문서의 제공으로인해 이러한 특허 , 등록 상표 , 저작권 및 기타 지적 재산권에 대한 그 어떤 사용권도 부여되지 않습니다 .

저작권 © 2008 Microsoft Corporation. 모든 권리 소유 .

Microsoft, ActiveSync, IntelliSense, Internet Explorer, MSDN, Visual Studio, Win32,Windows 및 Windows Mobile 은 Microsoft 회사 그룹의 등록 상표입니다 . 이 문서에 언급된 회사와 제품의 실제 이름은 해당 소유자의 상표일 수 있습니다 .

용례에 사용된 회사 , 기관 , 제품 , 도메인 이름 , 전자 메일 주소 , 로고 , 사람 , 장소 및 이벤트는 다른 설명이 없는 한 실제 데이터가 아닙니다 . 어떠한 실제 회사 , 기관 , 제품 , 도메인 이름 , 전자 메일 주소 , 로고 , 사람 , 장소 또는 이벤트와도 연관시킬 의도가 없으며 그렇게 유추해서도 안 됩니다 .

인수 편집인 : 산드라 웨버 (Sondra Webber), Microsoft Corporation

저자 : 니콜라스 베슨 (Nicolas Besson), Adeneo Corporation레이 마르실라 (Ray Marcilla), Adeneo Corporation라제쉬 캐이드 (Rajesh Kakde), Adeneo Corporation

집필 감독 : 워런 루보 (Warren Lubow), Adeneo Corporation

기술 검수인 : 브리지트 후왕 (Brigette Huang), Microsoft Corporation

편집 제작 : Biblioso Corporation

본문 번호 X00-00000

iii

간단한 내용

서문 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi

소개 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii

1 운영체제 디자인 설계 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 런타임 이미지 빌드와 배포 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3 시스템 프로그래밍 실행 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

4 디버깅 및 시스템 테스트 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

5 보드 지윈 패키지의 사용자 지정 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

6 장치 드라이버 개발 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

용어 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

색인 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

저자에 대하여 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

145

제 4 장

디버깅 및 시스템 테스트

디버깅과 시스템 테스트는 시스템 개발 주기에 있어서 중요한 작업이다 . 소프트

웨어와 하드웨어적인 결함을 찾아내고 해결하는 것을 궁극적인 목표로 한다 . 디

버깅의 의미는 코드를 단계적으로 실행시키거나 출력된 디버깅 메시지를 분석하

여 오류의 윈인을 분석하는 과정을 의미한다 . 시스템 구성요소에 대한 구현과 일

반적인 어플리케이션에 대해서 공부하는 것은 디버깅과 테스트를 위한 좋은 방

법 중 하나이다 . 또 한 편으로는 , 시스템 테스트는 일반적인 사용 시나리오 , 성

능 , 안전성 , 보안 , 그리고 기타 관련성이 있는 측면에서 그것의 최종 구성으로

시스템의 유효성을 검증하는 품질 - 보증 활동이다 . 시스템 테스트의 전체 목적

은 , 메모리 누수 , 교착 상태 , 또는 하드웨어 충돌 같은 제품 결함과 오류를 발견

하는 것이다 . 반면에 디버깅은 이러한 문제의 윈인을 규명하고 그들을 제거하는

것이다 . 소형 임베디드 시스템의 시스템 결함을 확인하고 제거하는 일은 대부분

의 개발자들에게도 어려운 부분중의 하나이다 . 이 장에서는 윈도우 임베디드 CE

6.0 R2 를 위한 개발 환경인 플랫폼 빌더 ( 마이크로소프트 비주얼 스튜디오®

2005 설치되어 있는 ) 에 있는 툴을 이용하여 디버깅과 테스트 하는 방법에 대해

다룬다 . 이 툴들은 디버깅 및 테스트 과정을 자동화 하고 보다 빠르게 하여 개발

하는 시스템을 보다 버그가 없는 시스템을 릴리스 할수 있도록 도와준다 . 또한

윈도우 임베디드 CE 테스트 키트 (CETK) 를 사용하여 테스트 자동화 방법에 대

해 설명한다 . 이러한 툴들에 대해 좀더 마스터할수록 코드를 수정하는 대신 코드

를 작성하는데 좀더 시간을 활용할 수 있다 .

이 장에서의 학습 목표 :

■ 런타임 이미지 디버깅을 위한 요구 사항을 식별

■ 코드 실행 분석을 위한 디버거 기능의 사용

■ 디버그 메시지의 출력을 관리하는 Debug Zone 에 대한 이해

■ CETK 툴을 이용하여 기본 테스트 및 사용자 정의 테스트 하기

■ 부트 로더와 운영 체제 (OS) 의 디버깅

146 제 4장 디버깅 및 시스템 테스트

시작하기 전에이 장의 학습을 완벽하게 이해하려면 , 사용자는 반드시 다음 과정을 하여야 한다 .

■ 윈도우 임베디드 CE 소프트웨어 개발 및 디버깅 개념에 관한 최소한의 기초

지식

■ 윈도우 임베디드 CE 지윈하는 드라이버 아키텍처의 기본적 이해

■ OS 디자인 및 시스템 구성 개념에 관한 지식

■ 플랫폼 빌더가 통합된 윈도우 임베디드 CE 6.0 R2 와 마이크로소프트 비주

얼 스튜디오® 2005 서비스 팩 1 이 설치된 개발용 컴퓨터 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 147

제 1과 : 소프트웨어 관련 오류 찾아내기소프트웨어 관련 오류 범위는 단순 오타 , 초기화되지 않은 변수 및 무한 루프에

서부터 중요한 경합 조건 (Critical Race Condition) 과 다른 쓰레드 동기화 문제

같은 더욱 복잡하고 난해한 문제까지 이른다 . 다행히도 , 한번에 대부분의 오류

위치를 수정하는 것은 용이하다 . 이러한 오류를 발견하는 가장 효과적인 비용 절

감 방법은 코드 분석을 통해서 이루어진다 . 사용자는 운영체제 디버깅뿐만 아니

라 드라이버와 어플리케이션 디버깅에까지 윈도우 임베디드 CE 장치의 다양한

도구를 사용할 수 있다 . 이러한 디버깅 도구의 완벽한 이해는 사용자가 코드 분

석을 빨리 하는 것을 도와 소프트웨어의 오류를 가능한 효율적으로 수정할 수 있

도록 한다 .

이 과정을 마치면 , 사용자는 다음과 같은 일을 할 수 있다 .

■ 윈도우 임베디드 CE 를 위한 중요한 디버깅 도구 식별 .

■ 드라이버와 응용 프로그램을 디버그 영역을 통한 디버그 메시지를 제어 .

■ 메모리 문제를 확인하기 위한 Target Control 의 사용 .

예상 학습 시간 : 90 분 .

디버깅 및 타겟 장치 제어윈도우 임베디드 CE 타겟 장치를 디버그하고 제어하는 주요한 도구는 그림 4-1

과 같이 개발용 워크스테이션에서 실행하는 플랫폼 빌더 이다 . 플랫폼 빌더 통합

개발 환경 (IDE) 는 디버깅 중 중단점에 멈춘 후 코드를 단계적으로 실행시키게

하거나 메모리 , 변수 , 의 정보를 표시하게 할 수 있다 . CE 타겟 제어 쉘 (CESH),

그리고 디버그 메시지 (DbgMsg) 기능과 같은 다양한 도구를 포함한다 . 플랫폼

빌더 IDE 는 런타임 이미지에서 타겟 장치의 상태를 분석하는 Heap Walker,

Processor Viewer, 그리고 kernel Tracker 와 같은 윈격 도구의 컬렉션을 포함

한다 .

148 제 4장 디버깅 및 시스템 테스트

그림 4-1 CE 디버깅 및 Target Control 구조

타겟 장치와 통신하기 위해서 , 플랫폼 빌더는 타겟 장치의 이미지에 포함된 디버

깅 컴포넌트와 코어 연결 (CoreCon) 인프라스트럭처를 이용한다 . CoreCon 인

프라스트럭처는 OS 접근 (OsAxS), Target Control, DbgMsg 서비스를 플랫폼

빌더에게 그리고 타겟 장치에는 Kernel Independent Transport Layer(KITL)

과 Bootstrap 서비스 인터페이스를 제공한다타겟 장치 . 타겟 장치에서는 디버깅

과 타겟 제어를 위해서는 KITL 을 사용하고 통신을 위해서는 부트 로더를 이용

한다 . 커널 디버거 스텁 (KdStub), 하드웨어 디버거 스텁 (HdStub), 그리고

OsAxS 라이브러리 같은 디버깅 컴포넌트를 런타임 이미지가 포함한다면 , 사용

자는 커널 런타임 정보를 얻고 Just-In-Time(JIT) 디버깅을 수행하기 위해 플

랫폼 빌더를 사용할 수 있다 . 사용자가 커널을 로드 하기 전에 타겟 장치 루틴을

제 1 과 : 소프트웨어 관련 오류 찾아내기 149

디버그 할 수 있도록 , 플랫폼 빌더는 또한 확장 디버깅 인터페이스 (eXDI) 통한

하드웨어 지윈 (hardware-assisted) 디버깅을 지윈한다 .

커널 디버거 커널 디버거는 커널 구성요소와 CE 응용프로그램을 디버깅 할 수 있게 하는 CE

소프트웨어 - 디버깅 엔진이다 . 개발용 위크스테이션에서 설치된 플랫폼 빌더를

이용하여 어플리케이션을 실행시키거나 디버깅 하기 위해 소스 코드에 중단점을

삽입하거나 삭제하는 작업을 직접할 수 있을 작업을 한다 . 그러나 플랫폼 빌더가

디버깅 정보를 잡을 수 있고 타겟 장치를 관리할 수 있도록 사용자는 KITL 을 지

윈할 수 있도록 런타임 이미지에 디버깅 라이브러리 (KdStub 과 OsAxS) 을 포함

해야 한다 . 이 장의 뒤에 있는 “디버깅 활성화를 위한 런타임 이미지 구성” 에

서 커널 디버깅에 대한 시스템 구성의 상세한 정보를 제공한다 . 다음의 타겟 중

심의 구성요소는 커널 디버깅에 필수적이다 .

■ KdStub 예외와 중단점을 캡처, 커널 정보의 검색과 커널 작업을 수행한다.

■ OsAxS 메모리 할당에 관한 정보 , 활성 프로세스 및 쓰레드 , 프록시

(proxies), 그리고 로드 된 동적 - 링크 라이브러리 (DLLs) 같이 운영 체제

의 상태에 대한 정보를 검색한다 .

참고 윈도우 임베디드 CE 의 응용프로그램 디버깅

커널 디버거를 이용하여 사용자는 전체 런타임 이미지 뿐만 아니라 개개의 어플리케이션을 제어할 수있다 . 그러나 KDSTUB 는 제 3 장 “시스템 프로그래밍의 수행”에서 설명한 첫 FIRST-CHANCE 예외와SECOND-CHANCE 예외를 받는 커널 구성요소이다 . 만약 사용자가 타겟 - 사이트 KDSTUB 모듈을 먼저 멈추지 않고 커널 디버거를 멈춘 상태에서 예외가 발생한다면 , 런타임 이미지는 디버거를 다시 연결할때까지 응답을 하지 않을 것이다 . 그 이유는 커널 디버거가 제대로 예외를 처리해야 타겟 장치가 계속 실행 할 수 있기 때문이다 .

디버그 메시지 서비스플랫폼 빌더에서 , 사용자가 KITL 와 KdStub- 활성화된 타겟 장치에 연결할 때 ,

사용자는 마이크로소프트 비주얼 스튜디오 2005 의 출력 윈윈도우에서 나오는

디버그 정보를 확인할 수 있다 . 풀랫폼 빌더는 CoreCon 인프라스트럭처의

DbgMsg 서비스를 이용하여 타겟 장치로부터 얻어지는 정보이다타겟 장치 . 디

버그 메시지는 실행중인 프로세서 정보 , 잘못된 입력과 같은 잠재적으로 중요한

문제를 일으킬만한 정보 , 오류가 발생할 만한 코드 위치에 대한 힌트를 준다 . 이

후 이 정보를 이용하여 커널 디버거를 이용하여 중단점을 설정하고 디버깅을 통

해 코드의 문제점을 확인할 수 있다 . 커널 디버거 스텁 (Stub) 의 기능 중 하나는

디버그 메시지의 동적 관리 지윈이다 . 그래서 사용자는 소스 코드 변경 없이 디

버그 메시지의 출력을 다양하게 구성할 수 있다 . 다른 것들 중에서 , 사용자가 비

150 제 4장 디버깅 및 시스템 테스트

주얼 스튜디오 안에 타겟 메뉴의 디버그 메시지 옵션 선택을 통해 사용자는

Timestamps, Process ID, 또는 Thread ID 를 배제할 수 있다 . 사용자는 또한

별도의 도구를 가지고 분석을 위한 파일에 대해 디버그 출력을 보낼 수 있다 . 타

겟 장치에서 , 모든 디버그 메시지는 NKDbgPrintf 함수를 통해 출력 스트림 ( 화

면이나 파일 ) 에 직접 보내진다 .

참고 KITL 과 KITL 없는 디버그 메시지

커널 디버거와 KITL 모두가 활성화된 경우 , 디버그 메시지를 비주얼 스튜디오의 OUTPUT WINDOW 에 출력된다 . 만약 KITL 을 사용할 수 없는 경우 , 디버그 정보는 타겟 장치에서 개발용 컴퓨터로 OAL(OEMADAPTATION LAYER) 을 이용한 시리얼 포트를 통해 전달된다 .

디버그 메시지를 위한 매크로

디버그 정보를 생성시키기 위하여 , 윈도우 임베디드 CE 는 디버그 매크로와 리테

일 매크로 두 범주로 일반적으로 나누어 지며 , 여러가지 디버깅 매크로를 제공한

다 . 리테일 매크로 가 디버그와 리테일 빌드 구성 (WINCEDEBUG= 리테일 ) 양쪽

모두 정보를 생성시키는 반면에 사용자가 Ship 구성 (WINCESHIP=1) 으로 런타임

이미지를 구축하지 않으면 , 디버그 빌드 구성 ( 환경변수 WINCEDEBUG=debug)

에서 단지 디버그 매크로 출력 정보만 컴파일 된다 . Ship 구성 , 모든 디버깅 매크

로는 사용할 수 없다 .

표 4-1 은 사용자가 디버그 정보를 생성하기 위하여 사용자의 코드에 삽입할 수

있는 디버깅 매크로를 요약한 것이다 .

표 4-1 디버깅 메시지 출력을 위한 윈도우 임베디드 CE 매크로

매크로 설명

DEBUGMSG 런타임 이미지가 디버그 빌드 옵션으로 컴파일 되면 printf-style 디버그 메시지를 기본 출력 스트림 ( 즉 , 비주얼 스튜디오의 출력 윈도우 또는 지정된 파일 ) 에 인자로 출력한다 .

리테일 MSG 런타임 이미지가 디버그 또는 릴리스 빌드 옵션으로 컴파일 되었고, 그러나 Ship 빌드 구성이 아닌 경우 printf-style 디버그 메시지를 기본 출력 스트림 ( 즉 , 비주얼 스튜디오의 출력 윈도우 또는 지정된 파일 ) 에 인자로 출력한다 .

ERRORMSG 런타임 이미지가 디버그 또는 릴리스 빌드 옵션으로 컴파일 되었고 Ship 빌드 구성이 아닌 경우 부가적인 printf-style 디버그 정보를 기본 출력 스트림 ( 즉 , 비주얼 스튜디오의 출력 윈도우 또는 지정된 파일 ) 에 인자로 출력한다 . 이 오류 정보는 소스 코드 파일명과 행 번호를 포함한다 . 에러 메시지를 출력한 소스와 코드의 위치를 빠르게 찾을 수 있도록 해준다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 151

디버그 영역디버그 메시지는 다중 - 쓰레드 프로세스를 분석하는데 특히 유용한 도구이다 .

특히 쓰레드 동기화 및 다른 다른 타이밍 관련 문제를 디버거로 코드를 순차적으

로 실행시키면서 문제를 찾아내는 것은 어렵다 . 그러나 , 사용자의 코드에 디버

깅 매크로를 많이 사용한다면 , 타겟 장치에 생성된 디버그 메시지의 수가 압도적

일 수 있다 . 생성된 정보의 양을 제어하기 위하여 , 디버깅 매크로는 사용자가 인

자의 표현을 지정할 수 있게 한다 .

예를 들어 , dwCurrentIteration 값이 가능한 최대값보다 더 크다면 다음의 코드

는 오류 메시지를 출력한다 .

ERRORMSG(dwCurrentIteration > dwMaxIteration,

(TEXT("Iteration error: the counter reached %u, when max allowed is %u\r\n"),

dwCurrentIteration, dwMaxIteration));

위의 보기에서처럼 , ERRORMSG 가 dwCurrentIteration 이 dwMaxIteration 보

다 더 클 때마다 디버깅 정보를 출력한다 , 그러나 사용자는 또한 조건문에서

Debug Zone 을 이용하여 디버깅 메시지를 제어할 수 있다 . 사용자가 매시간마

다 소스 코드를 변화시키거나 다시 컴파일 하지 않고 다양한 수준에서 모듈 ( 즉 ,

실행 파일 또는 DLL) 의 코드 실행을 검사하기 위해 DEBUGMSG 매크로를 사용

하기 윈한다면 , 이것은 특히 유용하다 . 첫째로 사용자는 실행 가능한 파일이나

DLL 에서 디버그 영역을 활성화해야 한다 . 그리고 어떤 영역을 활성화 시킬건지

ASSERTMSG 런타임 이미지가 디버그 빌드 구성으로 컴파일 되면 사실 , ASSERTMSG 는 DBGCHK 에 의해 DEBUGMSG 를 호출한다 . printf-style 디버그 메시지를 기본 출력 스트림 ( 즉 , 비주얼 스튜디오의 출력 윈도우 또는 지정된 파일 ) 에 인자로 출력한다 . 그리고 디버깅 모드로 전환된다 .

DEBUGLED 런타임 이미지가 디버그 빌드 옵션에서 컴파일 되고 WriteDebugLED 함수에 WORD 값을 인자로 전달한다 . 이 매크로는 시스템 상태를 나타내기 위한 발광 다이오드 (LED) 를 장착하고 OAL 에 OEMWriteDebugLED 함수가 구현된 시스템에 유용하다 .

리테일 LED 런타임 이미지가 디버그 빌드 옵션으로 컴파일 되고 WriteDebugLED 함수에 WORD 값을 인자 전달한다 . 이 매크로는 시스템 상태를 나타내기 위해 LED 가 장착되어 있고 OAL 에 OEMWriteDebugLED 함수가 구현되어 있는 시스템에서만 사용가능하다 .

표 4-1 디버깅 메시지 출력을 위한 윈도우 임베디드 CE 매크로

매크로 설명

152 제 4장 디버깅 및 시스템 테스트

지정하기 위해 디버그 메시지서비스를 가지고 글로벌 DBGPARAM 변수를 등록

한다 . 개발용 워크스테이션이나 타겟 장치에 있는 레지스트리 설정을 통하여 , 또

는 사용자가 현재 기본값 영역을 프로그래밍 방식으로 지정할 수 있다 . 또한 대

상 메뉴 또는 Target Control 윈도우에 , CE 디버그 영역을 통한 플랫폼 빌더에

있는 모듈을 위하여 동적으로 디버그 영역을 제어하는 것이 가능하다 .

팁 디버그 영역을 우회

사용자가 런타임 이미지를 REBUILD 할 때 사용자가 TRUE 나 FALSE 로 설정할 수 있는 DEBUGMSG 와 리테일 MSG 매크로에게 BOOLEAN 변수를 전달한다면 , 드라이버와 응용프로그램에 있는 디버그 영역을 우회할 수 있다 .

영역 등록

디버그 영역을 이용하기 위해 , 사용자는 표 4-2 에 요약된 모듈 이름 , 사용자가

등록하는 것을 윈하는 디버그 영역의 이름 , 그리고 현재의 영역 마스크를 위한

필드를 지정하는 하는 세가지 필드와 글로벌 DBGPARAM 변수를 정의해야 한다.

표 4-2 DBGPARAM 변수

필드 설명 보기

lpszName 모듈의 이름을 최대 길이 32 자까지정의한다 . TEXT("ModuleName")

rglpszZones 디버그 영역을 위해 16 가지 종류의 영역 이름의 배열을 정의한다 . 각각의 이름은 최대 32 자까지 사용할 수 있다 . 플랫폼 빌더는 모듈에서 활성 영역을 선택할 때 사용자에게 이 정보를 화면 표시한다 .

{

TEXT("Init"),

TEXT("Deinit"),

TEXT("On"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Undefined"),

TEXT("Failure"),

TEXT("Warning"),

TEXT("Error") }

ulZoneMask 현재의 선택한 영역을 확인하는 DEBUGZONE 매크로에서 현재 영역 마스크를 사용한다 .

MASK_INIT | MASK_ON |

MASK_ERROR

제 1 과 : 소프트웨어 관련 오류 찾아내기 153

참고 디버그 영역

윈도우 임베디드 CE 는 총 16 가지 이름의 디버그 영역을 지윈한다 . 그러나 모듈이 그들을 필요하지않는 다면 모두를 정의하지 않아도 된다 . 각 모듈은 구현된 DEBUG ZONE 목적에 명확하게 부합하도록영역별로 분리해서 사용하도록 한다 .

Dbgapi.h 헤더 파일은 DBGPARAM 구조체와 디버깅 매크로를 정의한다 . 이러

한 매크로가 dpCurSettings 로 이름 지어지고 , 미리 정의된 DBGPARAM 변수

를 사용하기 때문에 , 다음 코드 일부와 같이 , 사용자의 소스 코드에서 동일한 이

름으로 사용한다는 것은 중요하다 .

#include <DBGAPI.H>

// A macro to increase the readability of zone mask definitions #define DEBUGMASK(n) (0x00000001<<n)

// Definition of zone masks supported in this module#define MASK_INIT DEBUGMASK(0) #define MASK_DEINIT DEBUGMASK(1) #define MASK_ON DEBUGMASK(2) #define MASK_FAILURE DEBUGMASK(13) #define MASK_WARNING DEBUGMASK(14) #define MASK_ERROR DEBUGMASK(15)

// Definition dpCurSettings variable with the initial debug zone state // set to Failure, Warning, and Error.DBGPARAM dpCurSettings = { TEXT("ModuleName"), // Specify the actual module name for clarity! { TEXT("Init"), TEXT("Deinit"), TEXT("On"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"), TEXT("Failure"), TEXT("Warning"), TEXT("Error") }, MASK_INIT | MASK_ON | MASK_ERROR};

// Main entry point into DLL BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ if(ul_reason_for_call == DLL_PROCESS_ATTACH) { // Register with the Debug Message service each time // the DLL is loaded into the address space of a process. DEBUGREGISTER((HMODULE)hModule); } return TRUE;}

154 제 4장 디버깅 및 시스템 테스트

Debug Zones 정의위에 있는 예제 코드는 모듈에 대한 6 가지 Debug Zone 의 등록과 디버깅 메크

로에 대한 조건문을 보여준다 . 다음 코드는 이와 같은 일을 하는 예를 보여준다 .

DEBUGMSG(dpCurSettings.ulZoneMask & (0x00000001<<(15)),

(TEXT("Error Information\r\n")));

만일 디버그 영역이 MASK_ERROR 로 현재 설정되어 있다면 , 조건식의 값이

TRUE 이기 때문에 디버그 출력 스트림에 출력하게 된다 . 그러나 코드의 가독성

을 높이기 위해 밑에 예시된 코드와 같이 Dbgapi.h 에 DEBUGZONE 매크로를

정의해서 사용해야 한다 . 무엇보다도 Debug Zone 을 논리적 연산자인 AND 나

OR 에 의한 간단히 정의 사용할 수 있게 한다 .

#include <DBGAPI.H>

// Definition of zone flags: TRUE or FALSE according to selected debug zone.

#define ZONE_INIT DEBUGZONE(0)

#define ZONE_DEINIT DEBUGZONE(1)

#define ZONE_ON DEBUGZONE(2)

#define ZONE_FAILURE DEBUGZONE(13)

#define ZONE_WARNING DEBUGZONE(14)

#define ZONE_ERROR DEBUGZONE(15)

DEBUGMSG(ZONE_FAILURE, (TEXT("Failure debug zone enabled.\r\n")));

DEBUGMSG(ZONE_FAILURE && ZONE_ WARNING,

(TEXT("Failure and Warning debug zones enabled.\r\n")));

DEBUGMSG(ZONE_FAILURE || ZONE_ ERROR,

(TEXT("Failure or Error debug zone enabled.\r\n")));

Debug Zone 활성화 및 비활성화DBGPARAM 필드의 ulZoneMask 는 모듈의 현재 Debug Zone 을 설정할수 있

게하는 중요한 요소다 . 사용자는 전역 변수인 dpCurSett ings 변수의

ulZoneMask 값을 직접 변경하는 방법을 통해 모듈의 Debug Zone 을 변경하면

서 사용할 수 있다 . 다른 방법은 디버거 안에서 설정한 중단점에 의해 프로그램

수행이 멈췄을 때 Watch 윈도우에서 ulZoneMask 의 값을 직접 변경하는 것이다 .

사용자는 또한 다른 어플리케이션의 Debug Zone 을 SetDbgZone 함수를 사용

하여 설정하거나 변경 할 수 있다 . 실행중에 사용가능한 다른 방법은 그림 4-2

와 같이 Debug Zone 대화 상자를 사용하는 방법이다 . Debug Zone 대화 상자

는 비주얼 스튜디오에 있는 플랫폼 빌더에서 Target 메뉴에 있는 CE Debug

Zones 메뉴를 사용하여 이용할 수 있다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 155

그림 4-2 플랫폼 빌더에서 디버그 영역 설정

Name 항목은 디버그 영역을 지윈하는 타겟 장치에서 실행하는 모듈을 보여준다 .

선택한 모듈이 디버그 메시지 서비스를 등록하였다면 16 가지의 Debug Zone 이

표시되는 것을 볼 수 있다 . 그 이름들은 선택된 모듈의 dpCurSettings 정의한 것

과 동일하다 . 사용자는 Debug Zone 이름을 선택하여 Debug Zone 을 활성화 시

키거나 비활성화 시킬 수 있다 . dpCurSetting 변수에 설정된 Debug Zone 은 기

본적으로 활성화 되고 체크 상태로 표시된다 . 디버그 메시지 서비스를 등록하지

않은 모듈은 Debug Zone 표시에서 비활성화 되고 Debug Zone 설정을 할 수 없

다 .

운영체제 시작시 Debug Zone 설정윈도우 임베디드 CE 는 응용 프로그램이 시작하거나 DLL 을 프로세스로 로드할

때 dpCurSettings 변수에 설정된 값으로 Debug Zone 을 설정하게 된다 . 이때는

사용자가 중단점에 의해 멈춰진 상태에서 Watch 윈도우에서 ulZoneMask 값을

바꾸지 않는한 Debug Zone 을 바꾸는 것은 불가능하다 . 하지만 CE 는 좀더 간

편하게 레지스터리 설정을 변경하는 방법으로 Debug Zone 을 변경하는 방법을

지윈한다 . 로드되는 드라이버에서 다른 Debug Zone 을 활성화 시키기 위해서는

REG_DWORD 형식의 레지스터리를 만들어서 Registry 이름에는 해당 모듈

(lpszName 에 지정된 이름 ) 의 이름을 지정하고 값에는 활성화 시키고자 하는

Debug Zone 의 값 (dpCurSettings 변수에 지정된 값 ) 을 지정하면 된다 . 이 레

지스트리 값은 개발용 워크스테이션이나 타겟 장치를 변경함으로써 이용할 수 있

다 . 개발용 워크스테이션에 있는 레지스트리를 변경하는 장점은 PC 의 레지스터

리 변경 후 타겟 장치를 재 시작하는 것으로 대상 모듈에 대한 Debug Zone 변경

156 제 4장 디버깅 및 시스템 테스트

을 할 수 있지만 타겟 장치에 있는 레지스트리를 변경하는 것은 런타임 이미지를

다시 빌드해야 하는 단점이 있다 . 표 4-3 은 ModuleName 로 불리는 샘플 모듈

로 구성하는 예를 설명한다 . 항목이름은 실행가능한 EXE 파일이나 DLL 의 실제

이름이어야 한다 .

자세한 정보 페가수스 레지스트리 키

페가수스 이름은 1996 년 마이크로소프트사가 핸드헬드 개인용 컴퓨터와 다른 소비자 전자제품을 위해 출시된 첫 번째 윈도우 CE 버전의 코드 이름으로 알려졌던 이름이다 .

최상의 방법디버그 메시지를 이용하여 개발 작업을 한다는 것중 명심해야 할 것은 디버그 메

시지를 많이 출력하게 하면 코드 실행 속도가 늦어진다는 것이다 . 더욱 중요한

문제는 시스템은 디버그 출력 작업을 직렬화 하게 되고 , 이것은 의도되지 않는

쓰레드의 동기화 문제를 초래한다는 것이다 . 예를 든다면 , 다중 쓰레드 환경에

서 비동기적으로 동작하던 시스템이 릴리스 빌드에서는 문제가 없다가 디버그 빌

드에서는 문제를 일으키는 경우가 있다 .

표 4-3 시작 레지스트리 매개변수 예제

위치 개발용 워크스테이션 타겟장치

레지스트리 키 HKEY_CURRENT_USER₩Pegasus₩Zones

HKEY_LOCAL_MACHINE₩DebugZones

항목 이름 ModuleName ModuleName

유형 REG_DWORD REG_DWORD

값 0x00000001 - 0x7FFFFFFF 0x00000001 - 0x7FFFFFFF

코멘트 개발용 워크스테이션에서 디버깅 하는 모듈에 대한 Debug Zone 레지스터리 정보를 얻을 수 없을때 ( 개발용 워크스테이션이 없거나 레지스트리가 설정되지 않았을 때 ) 는 타겟에 설정된 레지스터리 정보를 이용해 Debug Zone 을 설정하게 된다 .

참고 모든 디버그 영역의 활성화

윈도우 임베디드 CE 는 응용프로그램 디버깅 목적을 위하여 디버그 영역의이름을 정의하고 REG_DWORD 값의 하위 16 비트를 사용한다 . 커널에 의해예약된 최상위 비트만 제외하고 남아 있는 비트들은 지정되지 않은 DEBUGZONE 을 위해 사용할 수 있다 . 그러므로 , 사용자는 모듈의 디버그 영역 값을 0XFFFFFFFF 로 설정해서는 안 된다 . 최대 값은 0X7FFFFFFF 이다 . 이미지정되어 있거나 지정되지 않은 DEBUG ZONE 으로 사용할 수 있다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 157

디버그 메시지 및 Debug Zone 을 사용하여 작업할 때 다음과 같은 방법을 사용

할것을 제안한다 .

■ 조건문 Debug Zone 에 대한 조건문을 사용하는 디버그 매크로를 사용하

라 . DEBUGMSG(TRUE) 를 사용하지 않는다 . 또한 조건문 없는 리테일

MSG(TRUE)같은 리테일 매크로를 사용하는 것을 피한다. 비록 일부 model

device driver (MDD)/ platform dependent driver (PDD) 드라이버는 이

기술을 사용하고 있다 .

■ 릴리스 빌드로 부터 디버깅 코드 제한 사용자가 단지 디버그 빌드에서 디

버그 영역을 사용한다면 , #ifdef DEBUG #endif 안에 전역 변수인

dpCurSettings 와 Debug Zone 값을 정의해야 한다 . 그래서 DEBUGMSG

와 같은 디버그 매크로 및 Debug Zone 을 제한해야 한다 .

■ 릴리스 빌드에서 리테일 매크로 사용 사용자가 또한 릴리스 빌드에서 디버

그 영역을 사용하는 것을 윈한다면 #ifndef SHIP_BUILD #endif 안에 전역

변수인 dpCurSetting 와 Debug Zone 값을 정의해야 한다 . 그리고 디버그

빌드에서 사용했던 DEBUGREGISTER 대신 릴리스 빌드에서는 리테일

REGISTERZONES 을 사용해야 한다 .

■ 모듈 이름을 명확하게 지정 가능하면 , 그 모듈의 파일 이름으로

dpCurSettings.lpszName 값을 설정한다 .

■ 기본값으로 중복 제한 드라이버의 기본 Debug Zone 은 ZONE_ERROR 나

ZONE_WARNING 을 사용하라 . 새로운 새로운 플랫폼을 동작시킬때는

ZONE_INIT 을 사용한다 .

■ 복구할 수없는 문제의 오류 디버그 영역 제한 ZONE_ERROR 는 모듈이나

중요한 기능이 잘못된 설정이나 다른 이슈로 문제가 될 때만 사용하라 . 복

구 가능한 문제를 위해 ZONE_WARNING 를 사용한다 .

■ 가능한 모든 오류 및 경고 제거 모듈은 ZONE_ERROR 이나

ZONE_WARNING 메시지 없이 로드 될 수 있어야 한다 .

Target Control 명령Target Control 서비스는 타겟 장치로 파일을 옮기고 응용프로그램을 디버그 하

기 위해서 디버거의 명령 쉘에 대한 접근을 제공한다 . 그림 4-3 과 같은 타겟 제

어 쉘은 비주얼 스튜디오내의 플랫폼 빌더 메뉴 Target 메뉴에서 Target

Control option 메뉴를 통해 표시할 수 있다 . Target Control 쉘을 사용하기 위

해서는 플랫폼 빌더와 타겟 장치와 KITL 을 통해 연결되어 있어야 함을 명심해

야 한다 .

158 제 4장 디버깅 및 시스템 테스트

도표 4-3 Target Control 쉘

다른 것들 중에서 , Target Control 쉘은 사용자가 다음의 디버깅 작업을 수행할

수 있게 한다 .

■ 디버깅 모드로 진입 (break 명령 ).

■ 메모리 내용 덤프를 디버그 창에 출력하기 (dd 명령 ) 나 파일로 저장하기 (df

명령 ).

■ 커널 (mi kernel 명령 ) 또는 전체 시스템 (mi full 명령 ) 을 위한 메모리 사용

량 분석 .

■ 프로세스 목록 출력(gi proc 명령), 쓰레드 (gi thrd 명령), 그리고 쓰레드 우

선순위 (tp 명령 ), 뿐만 아니라 시스템에 모듈을 로드 (gi mod 명령 ).

■ 프로세스 시작 (s 명령 ) 그리고 프로세스 종료시키기 (kp 명령 ).

■ 프로세스 힙 덤프 (hp 명령 ).

■ 시스템 프로파일러를 사용 또는 비사용 (prof 명령 ).

참고 Target Control 명령

TARGET CONTROL 명령의 전체 명령 설명은 MICROSOFT MSDN ® 웹사이트에 있는 http://msdn2.microsoft.com/en-us/library/aa936032.aspx 에서 윈도우 임베디드 CE 6.0설명서의 “TARGET CONTROL 디버깅 명령” 섹션을 참조한다 .

CEDebugX기본 내장된 디버거 명령 이외에 , Target Control 서비스는 커널과 응용프로그

램 디버깅의 효율성을 증가시키기 위해 CEDebugX 를 제공한다 . 이 확장 디버거

명령은 메모리 누수 , 교착 상태 , 그리고 시스템의 전반적인 동작상태를 분석하

는 부가적인 기능을 제공한다 . 부가적인 명령은 Target Control 쉘을 통해 접근

할 수 있고 느낌표 (!) 로 시작한다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 159

CEDebugX 명령을 사용하기 위해서는 Target Control 쉘에서 Break 명령이나

Break All 명령을 사용하여 디버거 모드로 진입해야 한다 .

힙 손상 , 교착 상태 , 또는 메모리 부족과 같은 잠재적인 문제의 윈인을 찾기 위

해서는 !diagnose all 명령을 사용하여 분석한다 . 그림 4-4 와 같이 정상적인 시

스템에서는 CEDebugX 에서 어떠한 문제도 나타나면 안된다 .

그림 4-4 CEDebugX 로 런타임 이미지 분석

!diagnose all 명령은 다음과 같은 진단을 실행한다 .

■ Heap 잠재한 콘텐츠 손상을 식별하기 위해 시스템의 모든 프로세서의 모

든 힙 객체를 진단한다 .

■ Exception 시스템에서 발생한 예외에 대해 진단하고 자세한 정보를 제공

한다 . 프로세스나 쓰레드의 ID, PC 주소 , 예외가 발생한 시간 등이다 .

160 제 4장 디버깅 및 시스템 테스트

■ Memory 잠재한 메모리 손상과 메모리 부족 상태를 식별하기 위해 시스템

메모리를 진단한다 .

■ Deadlock 쓰레드 상태 진단 및 시스템 객체를 분석한다 . ( 쓰레드를 동기

화에 대한 자세한 내용은 제 3 장 참조 ). 이것은 시스템 객체의 목록과 교착

상태가 발생한 쓰레드 ID 를 제공할 수 있다 .

■ Starvation 잠재한 쓰레드 자윈 부족을 식별하기 위해 쓰레드와 시스템 객

체를 진단한다 . 자윈부족은 높은 우선순위의 쓰레드를 처리하기 위해서 스

케줄러가 더 이상 다른 쓰레드를 스케줄 할 수 없을 때 발생한다 .

고급 디버거 도구Target Control 쉘과 CEDebugX 명령은 실행중인 시스템이나 CE dump 파일 (

만일 사용자가 post-mortem 디버깅으로 CE 덤프 파일 리더를 선택한다면 ) 의

완전한 분석을 수행할 수 있게 한다 . 그러나 사용자가 커맨드라인 인터페이스에

제한되지는 않는다 . 플랫폼 빌더는 효율적인 디버깅 목적으로 몇 가지의 그래픽

툴들을 포함하고 있다 . 이러한 툴들은 비쥬얼 스튜디어의 Debug 메뉴의

Windows 명령을 통해 사용할 수 있다 .

플랫폼 빌더 통합 개발 환경은는 다음의 고급 디버거 도구를 포함한다 .

■ Breakpoints 시스템에 설정된 중단점 목록을 나열하고 중단점에 대한 속

성을 표시 , 관리한다 .

■ Watch 지역 , 전역 변수에 대한 읽고 / 쓰기 기능을 제공한다 .

■ Autos Watch 윈도우와 비슷한 변수 관리 기능을 제공한다 . Watch 윈도

우의 경우 사용자가 변수를 직접 등록해야 하지만 Autos 는 디버거가 동적

으로 변수 목록을 등록하게 된다 . 함수에서 전단되는 인자의 값을 검사하는

것 같은 작업에서 유용하다 .

■ Call Stack 시스템이 중단점에 멈췄을 때만 사용 가능하다 . 시스템에서 동

작중인 프로세서와 쓰레드의 목록을 표시해 준다 .

■ Thread 시스템에서 실행되고 있는 쓰레드에 대한 목록을 제공한다 . 이 정

보는 동적으로 검색되고 언제든지 갱신될 수 있다 .

■ Module 시스템에서 로드되거나 로드 되지 않은 모듈에 대한 정보를 제공

한다 . 로드된 모듈의 메모리 주소 정보를 제공한다 . 이 기능은 실제로 드라

이버 DLL 이 로드 여부를 확인하는 데 유용하다 .

■ Process 프로세스 - 쓰레드와 비슷한 기능 , 시스템에서 실행되고 있는 프

로세스의 목록을 제공해 준다 . 프로세서를 종료시킬 수 있는 기능을 제공해

준다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 161

■ Memory 장치의 메모리에 대해 직접 접근할 수 있는 기능을 제공한다 . 메

모리의 주소나 변수의 이름으로 메모리의 내용을 볼수 있게 해준다 .

■ Disassembly 현재 실행중인 코드에 대한 어셈블리 코드를 보여준다 .

■ Register 특정한 코드의 라인을 수행할 때 CPU 레지스터 값을 볼수 있게

해준다 .

■ Advanced Memory 메모리에서 특정 내용을 찾거나 , 메모리 일부분을 다

른 영역으로 옮기기 , 특정 패턴으로 메모리 채우기와 같은 기능을 제공한다 .

■ List Nearest Symbols 지정한 메모리 주소에서 가장 근접한 심볼을 찾을

때 사용한다 . 심볼을 포함하고 있는 파일에 대한 완전한 경로 정보를 제공

한다 . 이 도구는 예외가 발생한 함수를 찾는데 유용하다 .

주의 메모리 손상

메모리와 고급 메모리 도구는 메모리 내용을 수정할 수 있다 . 이 도구를 잘못 사용하는 것은 시스템손상을 발생시킬 수 있고 타겟 장치에 있는 운영체제를 손상시킬 수 있다 .

Application Verifier ToolCETK 에 포함된 어플리케이션의 잠재적인 호환성 , 안정성 , 소스레벨 문제를 검

증하는 도구는 응용프로그램 검증 도구이다 . 이도구는 그렇지 않으면 독립형 장

치에서는 발생하는 문제점을 파악하기 힘든 어플리케이션이나 DLL 에 연결하여

문제점을 분석할 수 있다 . 응용프로그램 검증 도구는 개발용 워크스테이션에 반

드시 연결해서 사용해야 하는 것은 아니다 . 시스템 구동시 드라이버나 시스템 어

플리케이션을 검증할 수 있다 . 또한 CETK 내의 사용자 인터페이스를 통하거나

수동으로 시작할 수 있다 . 사용자가 CETK 의 응용프로그램 검증 도구를 외부에

서 사용하는 것을 윈한다면 , 사용자는 릴리스 디렉터리 안으로 모든 필수 파일을

복사하기 위해 Getappverif_cetk.bat 파일을 사용해야 한다 .

참고 Application Verifier Tool 설명서

사용자 정의 테스트나 테스트 함수의 테스트 방법 변경을 하는 확장 DLL 사용 방법에 대해서나 ,APPLICATION VERIFIER TOOL 에 대한 자세한 내용은 MICROSOFT MSDN 웹 사이트 http://msdn2.microsoft.com/en-us/library/aa934321.aspx 의 윈도우 임베디드 CE 6.0 의 설명서에 있는“APPLICATION VERIFIER TOOL”섹션을 참고한다 .

CELog 이벤트 추적 및 처리윈도우 임베디드 CE 는 사용자가 성능 문제를 진단하기 위해 런타임 이미지에 포

함할 수 있는 확장 가능한 이벤트 추적 시스템을 포함한다 . CELog 이벤트 추적

162 제 4장 디버깅 및 시스템 테스트

시스템은 사전 정의된 커널과 뮤텍스 , 이벤트 , 메모리 할당과 다른 커널 객체와

관계된 일련의 coredll 이벤트를 기록한다 . CELog 이벤트 추적시스템의 확장 가

능한 아키텍처는 또한 사용자가 사용자 정의된 이벤트를 추적하기 위해 사용자

지정 필터를 구현할 수 있게 한다 . KITL 을 통해 개발용 워크스테이션에 연결된

플랫폼을 위해 이벤트 추적 시스템은 표 4-4 에 요약된 것처럼 ZoneCE 레지스

터리를 이용하여 선택적으로 기록할 수 있도록 선택할 수 있다 .

CELog 이벤트 추적 시스템을 사용하여 타겟 장치의 램 영역에 저장되어 있는 로

그 정보를 수집하고 이용할 수 있다 . 수집된 로그 데이터는 윈격 커널 트랙커를

사용하거나 Readlog 와 같은 도구를 이용하여 분석할 수 있다 . CELogFlush 도

구를 사용하여 주기적으로 파일로 저장하고 이용할 수 있다 .

참고 CELog 와 ship 빌드

운영체제 최종 빌드시에는 CELOG 시스템을 포함시키지 말아야 한다 . CELOG 의 동작으로 인해 시스템성능과 가용 메모리의 감소 효과를 가져오기 때문이다 . 또한 악의적인 사용자의 시스템에 대한 공격시도를 줄이기 위해서다 .

Remote Kernel Tracker

Remote Kernel Tracker 도구는 사용자가 타겟 장치 시스템의 프로세서와 쓰레

드의 활동을 모니터 할 수 있게 한다 . 이 도구는 KITL 을 통해 타겟 장치로부터

얻은 정보를 실시간으로 화면에 표시할 수 있을 뿐만 아니라 CELog 파일을 이용

한 오프라인 분석도 가능하다 . 사용자는 3 장의 “시스템 프로그래밍 실행” 에

서 Remote Kernel Tracker 도구에 대한 더 많은 정보를 발견할 수 있다 . 그림

4-5 는 커널 트랙커를 이용하여 타겟 장치의 쓰레드 활동의 정보를 수집하는 것

을 보여준다 .

표 4-4 이벤트 로그 영역을 위한 CELog 레지스트리 매개 변수

위치 HKEY_LOCAL_MACHINE₩System₩CELog

레지스트리 항목 ZoneCE

항목 유형 REG_DWORD

값 <Zone IDs>

설명 기본값으로 모든 영역은 기록된다 . 모든 가능한 영역 ID 값 목록은 , 윈도우 임베디드 CE 6.0 설명서에 있는 “CELog Zones” 영역을 참조한다 . 이것은 마이크로소프트 MSDN 웹사이트 http://msdn2.microsoft.com/en-us/library/aa909194.aspx 에서 이용할 수 있다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 163

그림 4-5 커널 트랙커에서 쓰레드 정보

CELogFlush 도구

CELogFlush 도구는 타겟장치의 RAM 에 저장되어 있는 CELog 이벤트 자료를

.clg 형태의 파일로 저장하기 위해 사용한다 . 이 파일은 RAM 파일 시스템 , 저장

장치 , 또는 개발용 워크스테이션에 있는 릴리스 파일 시스템에 위치할 수도 있다 .

버퍼오버런으로 인한 자료 손실을 최소화 하기 위해 , 사용자는 더 큰 RAM 버퍼

를 지정할 수 있고 CELog 버퍼를 출력하는 주기를 증가시킬 수 있다 . 사용자가

반복된 파일 열고 닫는 작업을 회피하고 느린 영구적 저장 매체 대신 RAM 파일

시스템에서 파일을 저장하도록 설정해 놓는다면 좀 더 성능 향상을 기대할 수 있

다 .

참고 CELogFlush 구성

CELOGFLUSH 도구를 레지스터리를 설정을 통하여 구성하는 방법에 대한 자세한 내용은 윈도우 임베디드 CE 설명서의 “CELOGFLUSH 레지스트리 설정” 섹션을 참고한다 . 이것은 마이크로소프트 MSDN 웹사이트 http://msdn2.microsoft.com/en-us/library/aa935267.aspx 에서 이용할 수 있다 .

Readlog 도구그래픽 Remote Kernel Tracker 응용프로그램 이외에 %_WINCEROOT%

₩Public₩Common₩Oak₩Bin₩i386 폴더에 위치한 Readlog 툴을 이용하여

CELog 자료 파일을 처리할 수 있다 . Readlog 툴은 윈격 커널 트랙커에 의해 나

164 제 4장 디버깅 및 시스템 테스트

타나지 않는 디버그 메시지나 부트 이벤트등의 정보를 처리하고 화면에 보여주

는 커맨드 라인 도구이다 . 초기에 윈격 커널 트랙커를 이용하여 시스템을 분석하

는 것은 매우 유용한 방법이다 . 분석후 확인된 프로세서나 쓰레드를 Readlog 툴

을 이용하여 분석을 하게 된다 . CELogFlush 툴에 의해 저장된 .clg 파일은 영역

별로 정리가 되어 있기 때문에 특정한 정보를 정리 분석하기에 유용하다 . 사용자

는 또한 그 자료를 필터 할 수 있고 사용자 지정 이벤트 콜렉터를 통해 수집한 사

용자 지정 자료를 처리해서 확장 DLLs 에 기반하는 필터링 능력을 확장할 수도

있다 .

가장 유용한 Readlog 시나리오의 하나는 Remote Kernel Tracker 에서 시스템

분석을 용이하게 하기 위해서 CELog 자료파일에 있는 쓰레드의 시작 주소

(CreateThread 호출로 전달되는 함수 ) 를 실제 함수의 이름으로 교체하는 것이

다 . 이 기능을 사용하기 위해서는 -fixthreads 매개변수를 사용하여 Readlog 를

시작해야 한다 ( 즉 , readlog -fixthreads). Readlog 는 .map 파일에 있는 심볼

의 정보를 살펴보고 쓰레드 함수의 시작주소와 일치시켜 함수의 이름으로 정리

된 새로운 CELog 파일을 생성하게 된다 .

그림 4-6 CELog 데이터 파일이 readlog -fixthreads 명령에 의해 처리되고 윈격 커널 트랙커에 의해 열린 그림이다 .

제 1 과 : 소프트웨어 관련 오류 찾아내기 165

그림 4-6 은 Remote Kernel Tracker 에서 CELogFlush 도구를 이용하여 .clg

파일로 저장하고 , Readlog 툴을 -fixthreads 옵션을 사용하여 로그 파일을 처리

하고나서 Kernel Tracker 에서 처리된 .clg 파일을 분석하여 보여주는 것이다 .

실제 함수명이 나오기 때문에 분석이 좀더 용이하다 .

참고 참조 이름 일치 개선시키기

CELOG 이벤트 추적 시스템은 커널 프로파일러 기능을 설정하고고 환경변수에서 IMGPROFILER=1 로 설정해서 런타임 이미지를 재빌드 했을 때 사용 가능하다 . CELOG 이벤트 추적 시스템은 커널 프로파일러가 가지고 있는 쓰레드 함수 찾아보기 기능을 이용하고 있다 . 그러나 CELOG 는 런타임 이미지에 내장된 프로파일링의 심볼만 검색할 수 있다 . SOFTWARE DEVELOPMENT KIT(SDK) 에 기반하여 개발된 응용프로그램의 심볼은 CELOG 이벤트 추적시스템을 사용할 수 없다 .

요점 정리운영체제와 응용프로그램의 디버깅은 CE 시스템 그리고 플랫폼 빌더와 CETK

가 포함된 양쪽 모두의 지식이 요구된다 . 가장 중요한 디버깅 툴들은 시스템 디

버거 , 디버그 메시지 기능 , 그리고 CE 는 타겟 제어 쉘이다 . 디버그 메시지 기능

이 코드 실행을 방해하지 않고 시스템 구성요소와 응용프로그램을 분석하는 기

능을 제공하는 동안 , 시스템 디버거는 사용자가 중단점을 설정하고 커널과 응용

프로그램 코드를 단계적으로 실행시키면서 디버깅하는 기능을 가능하게 한다 .

디버그와 리테일 매크로의 다양성은 타겟장치에서 화면표시 구성요소 여부와 상

관 없이 디버깅 정보의 출력은 사용 가능하다 . 시스템과 응용프로그램이 잠재적

으로 대량의 디버그 메시지를 생성시킬 수 있기 때문에 , 사용자는 디버깅 정보의

출력을 제어하기 위해 디버그 영역을 이용해야 한다 . 디버그 영역의 중요한 장점

은 사용자가 런타임 이미지를 리빌드 하지 않고도 동적으로 디버그 정보의 출력

설정을 변경할 수 있다 . 또 한 편으로는 , 타겟 제어 쉘은 사용자가 Break 명령으

로 디버그 모드에 진입한 후 전반적인 시스템 상태를 확인할 수 있는 CEDebugX

의 기능중의 하나인 !diagnose all 명령어를 사용하여 분석한다 .

이 코어 디버깅 도구와는 별도로 , 사용자는 전형적인 CE 구성과 응용프로그램

검증 도구와 잠재한 응용프로그램 호환성과 안정성 문제를 식별하기 위해서 그

리고 프로세스 , 쓰레드 , 그리고 시스템 성능을 분석하는 Remote Kernel

Tracker 같은 도구를 사용할 수 있다 .Remote Kernel Tracker 는 CELog 이벤

트 추적시스템에 의존한다 . 타겟 장치의 메모리에 기록된 로그 데이터는

CELogFlush 도구를 이용하여 파일로 출력한다 . 분석하려는 모듈의 심볼 파일

을 가지고 있다면 Readlog 도구를 이용하여 로그 파일에 있는 쓰레드의 시작 주

소를 실제 함수의 이름으로 변경하여 새로운 로그 파일로 생성할 수 있다 .

Remote Kernel Tracker 를 이용해 이 로그 파일을 좀더 편리하게 사용할 수 있

게 한다 .

166 제 4장 디버깅 및 시스템 테스트

디버깅 가능한 런타임 이미지 구성윈도우 임베디드 CE 의 디버깅 기능은 개발용 워크스테이션 구성요소와 타겟 장

치에 의존한다 . 그리고 특정한 설정과 하드웨어 지윈을 요구한다 . 개발용 워크

스테이션과 타겟 장치 사이의 연결 없이 정보를 교환하거나 디버깅 할 수 없다 .

만약 타겟 장치의 디버깅 모듈을 언로드 하지않고 통신 연결이 끊어진다면 개발

워크스테이션에 있는 디버거는 멈출 것이다 . 또한 타겟 장치는 사용자의 입력에

무응답 할 것이다 . 그 이유는 디버거가 코드의 재 실행을 지시할때까지 대기 상

태가 되기 때문이다 .

이 과정을 마치면 , 사용자는 다음을 할 수 있다 .

■ 런타임 이미지를 위한 커널 디버거 활성화 .

■ KITL 요구사항의 확인 .

■ 디버깅 컨텍스트에 커널 디버거 사용 .

예상 학습 시간 : 30 분 .

커널 디버거 활성화 위와 같이윈도우 임베디드 CE 6.0 을 위한 개발 환경은 개발자가 CE 타겟 장치

에서 코드 실행과 코드를 순차적으로 실행하도록 제어할 수 있는 커널 디버거를

포함한다 . 이 디버거는 사용자가 타겟 장치와 개발용 컴퓨터 사이에 커널 선택과

통신 계층을 설정할 것을 요구한다 .

OS 디자인 설정디버깅을 위한 OS 설계를 활성화하게 하기 위해 , 플랫폼 빌더가 KdStub 라이브

러리를 포함하고 런타임이미지를 구축할 때 Board Support Package(BSP) 에

있는 KITL 통신 계층을 사용하게 하도록 환경 변수 IMGNODEBUGGER 과

IMGNOKITL 를 해제한다 . 비주얼 스튜디오에서 , 플랫폼 빌더에서는 메뉴를 통

하여 보다 손쉽게 설정할 수 있는 방법을 제공한다 . 그 방법은 OS desing project

를 선택하여 오른쪽 마우스 버튼을 누르고 , Properties 를 선택한다 . Build

Options 창에 Enable Kernel Debugger 와 Enable KITL 을 선택한다 . 1 장 “운

영 체제 설계의 사용자 지정” 에서 더 많은 OS Design 속성 페이지 대화 상자세

부사항을 논의한다 .

디버거 선택

런타임 이미지를 위해 KdStub 와 KITL 을 사용 가능하게 하면서 , 타겟 장치에

대한 통신 매개변수에서 타겟 장치 위에 시스템을 분석하기 위해 디버거를 선택

디버깅 가능한 런타임 이미지 구성 167

할 수 있다 . 이 매개변수를 구성하기 위해 , 2 장 “런타임 이미지 빌드 및 배포”

에서 설명한 대상 메뉴를 열고 , Connectivity Options 을 선택함으로써 비주얼

스튜디오에서 타겟 장치 연결 선택 대화 상자를 화면 표시한다 .

어떠한 디버거도 연결 옵션에는 선택되어있지 않다 . 다음과 같은 디버거 중 선

택해야 한다 .

■ KdStub 이것은 커널과 응용프로그램이 시스템 구성요소 , 드라이버 , 그리

고 타겟 장치에서 실행하는 응용프로그램을 디버그 하는 소프트웨어 디버거

이다 . KdStub 는 플랫폼 빌더와 통신하기 위해 KITL 을 요구한다 .

■ CE Dump File 플랫폼 빌더는 Dump 파일을 캡쳐하기 위한 옵션을 제공한

다 . 이 덤프 파일은 CE 덤프 파일 리더를 사용하여 불러 올 수 있다 . Dump

파일은 시스템의 특정한 상태를 살펴볼 수 있게 하는 유용한 도구다 .

■ Sample Device Emulator eXDI 2 Driver -KdStub 는 커널이 로드 되기 전

의 코드들은 디버깅 할 수 없다 . 디버깅 라이브러리는 소프트웨어에 의한 중

단점을 사용하기 때문에 인터럽트 처리 루틴 (ISR) 은 디버깅 할 수 없다 .

하드웨어 장치를 통한 디버깅을 위해 플랫폼 빌더에서는 joint test action

group(JTAG) 을 통하여 디버깅 할 수 있는 장비에 대한 샘플 eXDI 드라이

버를 제공한다 .

참고 하드웨어 -지윈 디버깅

하드웨어 - 지윈 디버깅에 관한 상세한 정보 는 윈도우 임베디드 CE 6.0 설명서의 “하드웨어 - 지윈디버깅” 섹션을 참고한다. 이것은 마이크로소프트MSDN 웹사이트 http://msdn2.microsoft.com/en-us/library/aa935824.aspx 에서 이용할 수 있다 . .

KITL이장의 시작 부분에서 그림 4-1 에서 볼 수 있듯이 KITL 은 개발용 컴퓨터와 타

겟 장치 사이에 필수적인 통신 계층이고 커널 디버거 지윈을 위해 사용하게 해야

한다 . 이름이 암시하는 것과 같이 , DMA 와 같게 KITL 은 완전하게 하드웨어와

독립적이다 . 네트워크 연결 , 시리얼 케이블 , 범용 직렬 버스 (USB), 또는 DMA

(DMA) 같은 기타 지윈하는 통신 메커니즘 위로 작동 한다 . 유일한 필요는 양 쪽

( 개발용 컴퓨터와 타겟장치 ) 모두 같은 인터페이스를 지윈하고 사용해야 한다 .

4-7 그림과 같이 장치 에뮬레이터를 위한 가장 일반적이고 빠른 KITL 인터페이

스는 DMA 이다 . 지윈된 이더넷 칩을 가지는 타겟 장치가 네트워크 인터페이스

를 사용하는 것은 일반적으로 가장 바람직하다 .

168 제 4장 디버깅 및 시스템 테스트

그림 4-7 KITL 통신 인터페이스의 구성

KITL 은 다음과 같은 두 가지 작업 방법을 지윈한다 .

■ Active Mode 기본값에 의해 , 플랫폼 빌더는 부팅 프로세스 동안 개발용 컴

퓨터에 연결하기 위해 KITL 을 구성한다 . 이 설정은 소프트웨어 개발 주기

동안 커널과 응용프로그램 디버깅에 대해서 유용하다 .

■ Passive Mode Device Boot에 활성화 KITL확인란을 선택 취소함으로써 수

동 모드로 KITL 을 구성할 수 있다 . 윈도우 임베디드 CE 는 KITL 인터페이

스를 초기화하는 것을 의미하나 KITL 은 구동 프로세스 동안 연결을 설정하

지 않는다. 예외가 발생하면, 사용자가 JIT 디버깅을 수행할 수 있도록 KITL

은 개발용 컴퓨터로 연결을 만들기 위해 시도한다 . 수동 모드는 구동할 때

개발용 컴퓨터로의 물리적 연결을 가지고 있지 않는 이동하기 쉬운 장치를

개발할 때 가장 유용하다 .

디버깅 가능한 런타임 이미지 구성 169

참고 KITL 모드와 부트 인자

장치부트 설정에 있는 ACTIVE KITL은 플랫폼 빌더가 부트 로더를 위해 구성하는 부트 인자(BOOTARGS)이다 . BSP 개발 프로세스 동안 부트 로더와 그들의 장점에 대한 더 많은 정보는 윈도우 임베디드 CE설명서의 “부트로더” 섹션을 참조한다 . 이것은 마이크로소프트 MSDN 웹사이트 HTTP://MSDN2.MICROSOFT.COM/EN-US/LIBRARY/AA917791.ASPX 에서 이용할 수 있다 .

타겟장치 디버깅하기개발자 - 측과 대상 - 측 디버거 컴포넌트는 각 각 독립적으로 실행된다는 것을

아는 것이 중요하다 . 예를들면 , 커널 디버거는 유효한 타겟장치 없이 플랫폼 빌

더와 함께 비주얼 스튜디오비주얼 스튜디오에서 실행하는 것이 가능하다 . 만일 ,

디버그 메뉴를 열고 시작을 클릭하거나 F5 키를 누르면 , 커널 디버거 (Kernel

Debugger) 는 타겟 장치에 연결을 기다리는 출력 창에서 시작과 동시에 정보를

알려준다 . 다른 한편으로는 , 이 장에서 언급한 바와 같이 만일 디버거에 유효한

KITL 연결 없이 디버깅 - 가능 런타임 이미지를 실행 하고 예외가 발생 한다면 ,

런타임 이미지는 시스템이 멈춤으로 말미암아 끈어지게 (hang) 되며 , 디버거로

부터 제어 요청을 기다린다 . 이러한 이유때문에 디버깅 - 가능 타겟 장치에 연

결할 때는 디버거는 일반적으로 자동으로 시작된다 . F5 를 눌러서 디버깅 세션

을 시작하는 대신에 대상 메뉴에서 (Target menu) 부착 장치 (Attach Device)

를 사용한다 .

중단점 활성화하기와 관리하기 Enabling and Managing 플랫폼 빌더의 디버깅 기능들은 Windows 의 데스크 탑 응용프로그램의 디버거

와 마찬가지로 그 기능을 제공 한다 . 그림 4-8 에서 서술한 바와 같이 중단점을

설정하거나 , 코드의 한 줄씩 따라하거나 , 조사식 창 (Watch window) 을 사용하

여 변수의 값과 개체 특성을 변경하거나 볼 수있다 . 기억 하여야 할 것은 , 그러

나 , 런타임 이미지에서 중단점 사용 능력은 KdStub 라이브러리의 존재함에 따

라 달려있다 .

중단점을 설정하기 위해서는 , 비주얼 스튜디오비주얼 스튜디오의 디버그 메뉴

에서 중단점 전환 옵션을 사용하여 설정 한다 . 다른 방법으로는 , F9 을 눌러 현

재의 입력란에서 중단점을 설정하거나 코드 입력란의 왼쪽 여백을 클릭한다 . 선

택한 것을 보면 , 디버는 중담점을 인스턴스화 하거나 하지 못하는지에 대하여 플

랫폼 빌더는 중단점을 빨간 점이나 윈으로 표시한다 . 빨간 윈은 인스턴스화 하지

못하는 중단점을 나타낸다 . 만일비주얼 스튜디오 인스턴스가 대상 코드 (targe

code) 와 연결이 되어 있자 안을 경우 인스턴스가 없는 중단점이 발생되며 , 중단

점은 설정이 되었지만 로드가 안된 상태이며 , 디버거는 사용 불능 상태이며 , 디

버거는 사용불능이거나 , 디버거가 실행중이나 코드 실행이 멈추지 않은 상태에

170 제 4장 디버깅 및 시스템 테스트

서 발생된다 . 만일 디버거가 실행중일때에 중담점을 설정하면 , 장치는 반드시 디

버거가 중단점을 인스턴스화 하기전에 먼저 디버거로 진입하여야 한다

그림 4-8 Hello World 응용프로그램 (application) 디버깅 하기

플랫폼 빌더와 함께비주얼 스튜디오 에서 중단점을 관리하기 위한 옵션은 다음

과 같다 .

■ 소스 코드 , 스택 (Call Stack) 호출 과 창 분리 (Disassembly windows) 상

황에 맞는 메뉴 (context menu) 에서 중단점을 삽입 / 삭제를 선택하거나 디

버그 메뉴에서 전환 중단점을 선택하거나 또는 F9 을 누름으로서 중단점을

설정 , 삭제 , 사용가능 , 사용불능으로 전환 할 수 있다 .

■ 새 중단점 대화 창 (New Breakpoint dialog box) 이 대화상자는 디버그 메

뉴에서 새 중단점 아래 있는 하위 메뉴로 표시 할 수 있다 . 새 중단점은 대

화상자는 중단점의 위치와 조건을 설정 할 수 있도록 하여 준다 . 디버거는

반복 계산이나 특별히 지정된 값이 조건 중단점의 조건 값이 TRUE 일때만

멈추게 된다 .

디버깅 가능한 런타임 이미지 구성 171

■ 중단점 창 (Breakpoints window) 디버그 메뉴에서 윈도우 하위 메뉴에 있

는 중단점을 클릭하거나 Alt+F9 를 누름으로서 중단점 창을 표시 할 수 있

다 . 중단점 창은 설정된 중단점 대화상자를 중단점과 중단점 속성 설정을

가능케하는 목록을 나열한다 . 예를들면 , 위치 정보를 수동으로 지정하는

새 중단점 대화상자를 사용하는 대신 , 윈하는 중단점을 소스 코드에 직접 설

정한 후 조건 매개변수를 정의하기 위한하여 중단점 창의 특성을 표시한다 .

팁 중단점이 많은 경우

연습으로 중단점을 사용하기 . 너무 많은 중단점을 설정하거나 계속해서 재 실행을 선택 할 경우 디버깅의 효과에 영향을 미칠 수 있으며 , 시스템의 한개의 시점에 초점을 마추기가 어렵다 . 필요 함에 따라 중단점을 비활성화 하거나 재 활성화하는 것을 고려 해보아야 한다 .

중단점 제한새 중단점 대화상자 또는 중단점 창에서 중단점의 속성을 구성 할때 , 하드웨어

중단점 또는 소프트웨어 중단점을 설정 할 수 있는 하드웨어 단추를 발견 할 수

있다 . OAL 코드나 인터럽트 처리기 (interrupt handlers) 에서는 소프트웨어 중

단점은 사용 할 수 없는데 , 왜냐하면 중단점은 시스템의 실행을 완전히 멈추게

하면 안되기 때문이다 . 다른 시스템 프로세스 사이에서 , KITL 연결은 유효화 되

어 있어야하는데 . 이는 개발 워크스테이션에서 유일하게 이 연결을 통하여 통신

할 수 있기때문이다 . OAL 과 함께 KITL 인터페이스는 커널의 인터럽트 기반

(interrupt-based) 통신 방식을 사용한다 . 만일 , 인터럽트 처리기 기능 ( 함수 )

에서 한 개의 중단점을 설정 한다면 , 중단점에 다다르면 인터럽트 처리는 단일

스레드와 무인터럽트 기능 ( 함수 ) 임으로 시스템은 더 이상 통신할 수 없게된다 .

만일 인터럽트 처리기를 디버그하여야 한다면 , , 디버그 메시지나 하드웨어 중단

점을 사용 할 수 있다 . 그러나 , 하드웨어 중단점은 프로세스의 디버그 등록기에

인터럽트를 등록하기 위해서는 eXDI 준수 디버거 (JTAG Probe 과 같은 ) 를 필

요로 한다 . 일반적으로 , 한 개의 하드웨어 디버거 만이 프로세스 중 사용 가능 한

데 , 그럼에도 불구하고 JTAG 는 다수의 디버거를 사용 할 수 있다 . 하드웨어 지

윈 디버깅을 하기 위해서 KdStub 라이브러리를 사용 할 수는 없다 .

하드웨어 중단점을 구성하기 위해서는 다음 단계를 따라하면 된다 .

1. 디버그 메뉴를 열고 중단점을 클릭함으로써 중단점 창을 연다 .

2. 중단점 목록에서 중단점을 선택하고 오른쪽 마우스 버튼을 클릭한다 .

3. 중단점속성을 대화상자를 표시하기 위하여 중단점 속성을 클릭한 다음 하드

웨어 단추를 클릭한다 .

172 제 4장 디버깅 및 시스템 테스트

4. 하드웨어 확인 버튼을 선택한 다음 모든 대화 상자를 닫기 위해 확인을 두

번 클릭한다 .

그림 4-9 하드웨어 중단점 설정하기

학습 요약만일 , 런타임 이미지에서 KITL 과 디버거 라이브러리를 포함 시키면 플랫폼 빌

더 IDE 에서 디버거를 사용 가능케 하는 구성 단계는 간단해진다 . 타겟 장치 연

결 옵션 (Target Device Connectivity Options) 대화상자를 표시한 후 , 적합한

디버거와 전송을 선택한다 . 일반적으로 , 전송은 DMA 나 이더넷 (Etherne) 을 사

용하는데 , USB 나 시리얼 케이블을 사용하여 타겟장치에 워크스테이션을 연결

할 수 도 있다 .

플랫폼 빌더는 윈도우 바탕화면에서 찾아 볼 수있는 디버거들 같은 디버깅 기능

을 제공한다 . 중단점의 설정은 코드의 줄에서 줄의 단계로 , Watch 창을 사용하

여 변수의 값과 개체 속성의 변경과 보기를 설정 함으로 할 수 있다 . 플랫폼 빌더

역시 지정한 기준에 의하여 코드 실행을 중지 할 수 있는 조건 중단점을 지윈한

다 . 소프트웨어 디버깅을 위한 디버거의 선택은 KdStub 인데 , 그럼에도 불구

하고 , 다른 하드웨어 디버거나 JTAG 프로브 (Probe) 상에서 하드웨어 - 지윈 디

버깅 기반을 위한 플랫폼 빌더와 함께 eXDI 드라이버를 사용 할 수 있다 . 하드

웨어 - 지윈 디버깅은 커널에 로딩 하기전 시스템의 루틴을 분석하거나 OAL 컴

포넌트 와 인터럽트 처리기 기능을 소프트웨어 중단점이 사용 할 수 없는 위치에

서 사용 가능케 한다 .

학습 3 : CETK 를 사용하여 시스템 테스트하기 173

학습 3 : CETK 를 사용하여 시스템 테스트하기자동화된 소프트웨어 테스트는 지윈 비용과 개발 비용을 낮추고 제품의 질을 향

상시키는데 중요한 역활을 한다 . 이 것은 , OAL 코드를 구현하거나 , 새 장치 드

라이버를 추가하거나 , 타겟 장치를 위한 사용자화된 BSP 를 생성 할 때 특히 중

요하다 . 시스템의 새로운 시리즈를 프로덕션에 릴리스 하기전에 , 기능테스트 ,

단위테스트 , 스트레스테스트와 다른 종류의테스트를 통하여 시스템의 각 부분과

을 검증 하는 것과 일반 상태에서 타겟장치가 안정적으로 실해이 되는지를 실행

하여 보는 것이 매우 중요하다 . 시스템이 개발 중 일때 테스트 도구 와 스크립트

를 생성하거나 , 타겟 장치를 사용자의 환경과 비슷한 환경으로 작업하는 도중 결

함이 발견 되었을때 수정 하는 것 보다 제품이 시장에 도달한 후에 수정하는 것

은 더 많은 비용이 들 수 가 있다 . 시스템 테스트는 마케에 도달하기 전에 실행

되어져야한다 . 소프트웨어 개발 기간중효과적으로 시스템 테스트를 하기 위해서

는 CETK 를 사용 할 수 있다 .

이 학습을 마친 후 , 다음과 같은 것을 할 수 있음 :

■ CETK 검사 도구를 위한 일반적인 사용 시나리오 기술 .

■ 사용자 정의된 CETK 테스트를 생성 .

■ 타겟 장치에서 CETK 테스트를 실행 .

예상 학습 시간 : 30 분 .

윈도우 임베디드 CE 테스트 키트 개요CETK 은 분리된 테스트이며윈도우 임베디드를 위한 플랫폼 빌더를 포함 한 응

용프로그램으로서 응용프로그램의 안정성 검증과 CE 테스트 목록에서 자동화

된 테스트 구성의 시리즈에 기반을 둔 장치 드라이버를 포함한다 . CETK 은 주

변기기의 여러 드라이버 카테고리를 위한 여러 기본 테스트를 포함하며 , 특정한

필요에 따라 사용자화 테스트를 생성 할 수 있다 .

참고 CETK 검사

CETK 에 포함된 기본 테스트 목록을 위해서는 마이크로소프트 MSDN 웹사이트 ht tp : / /msdn2.microsoft.com/en-us/library/aa917791.aspx 에 있는 윈도우 임베디드 CE 6.0 문서의“CETK테스트”섹션을 참조 하면 된다 .

CETK 아키텍처 (Architecture)그림 4-10 에서 서술 한바와 같이 , CETK 응용프로그램은 타겟 장치의 개발 컴

퓨터 상에서 실행되는 컴포넌트의 클라이언트 / 서버 (client/server) 솔루션이다 .

174 제 4장 디버깅 및 시스템 테스트

개발 컴퓨터는 타겟장치가 클라이언트 - 측 응용프그램 (Clientside.exe), 테스트

엔진 (Tux.exe), 테스트 결과 로거 (Kato.exe) 를 실행하는 동안 워크스테이션 서

버 응용프로그램 (CETest.exe) 을 실행한다 . 다른 것들 사이에서 , 이 아키텍처

는 개발 워크스테이션에서 다수의 서로 다른 장치상에서 동시에 여러 테스트들

을 실행할 수 있게하여준다 . 워크스테이션 서버와 클라이언트 - 측 응용프로그

램은 KITL, ActiveSync ® , 또는 윈도우 소켓 (Winsock) 의 연결을 통하여 통신

한다 .

그림 4-10 CETK 클라이언트 / 서버 아키텍처

CETK 응용프로그램은 다음과 같은 컴포넌트를 포함한다 .

■ 개발 워크스테이션 서버 (Development workstation server) CETest.exe

는 CETK 테스트를 실행하거나 관리 할 수 있도록 GUI(Graphic User

Interface) 를 제공한다 . 이 응용프로그램은 서버 설정과 매개변수 연결을

설정 할 수 있으며 , 타겟 장치에도 연결 할 수 있도록 하여준다 . 장치 연결

을 설정 하기 위해서 워크스테이션 서버는 클라이언트 쪽 응용프로그램을

자동으로 다운로드하고 시작하며 , 테스트 검사 요청을 제출하고 , 표시하기

위하여 실시간으로 캡쳐 로그 에 기반을 둔 테스트의 결과 를 컴파일 한다 .

■ 클라이언트 쪽 응용프로그램(Client-side application) 워크스테이션 서버

응용프로그램의 Clientside.exe 인터페이스는 테스트 엔진을 제어 하는 것

과 서버 응용프로그램에 테스트 결과를 반환한다 . 만일 , Clientside.exe 가

타겟장치상 에서 사용 할 수 없을 경우 , 워크스테이션 서버는 타겟장치에

통신 스트림 (stream) 을 설치 할 수 없다 .

학습 3 : CETK 를 사용하여 시스템 테스트하기 175

■ 테스트 엔진(Test engine) CETK 테스트는 대상 장치에서 Tux.exe 가 로

드되고 실행되는 DLL 내에서 구현된다 . 일반적으로 , 테스트 엔진은 워크

스테이션 서버와 클라이언트 쪽 응용프로그램을 통하여 윈격으로 시작 할

수 있고 , Tux.exe 를 로컬에서 실행 할 수 있으며 , 워크스테이션 서버의 필

요 없이 독립으로 실행 할 수 있다 .

■ 테스트 결과 로거 (Test results logger) Kato.exe 는 로그 파일에 있는

CETK 의 결과를 추적한다 . Tux DLLs 은 이 로거를 사용하여 테스트의

성공 여부와 여러 사용자 정의된 출력 장치로 출력이 라우팅이 되었는지에

대한 추가 정보를 제공한다 . 이유는 모든 CETK 테스트는 동일한 로거와

형식을 사용하는데 , 특정 요구사항 에 의한 자동 결과 진행을 위한 사용하

거나자화 로그 파일 파서를 구현하거나 또는 기본 파일 파서 (parser) 를 사

용하는 것이 가능 하기 때문이다 .

참고 관리 코드를 위한 CETK (CETK for managed code)

CETK 의 관리 버전은 네이티브 (NATIVE) 와 관리 코드의 유효성을 확인 하기 위하여 사용이 가능하다 .관리 버전에 관한 자세한 사항은, MICROSOFT MSDN 웹사이트http://msdn2.microsoft.com/en-us/library/aa934705.aspx 의 WINDOWS EMBEDDED CE 6.0 문서에 있는 “TUX.NET TEST HARNESS”의 섹션을 참조하라 .

CETK 사용하기타겟 장치에서 여러 연결 옵션을 지윈하기 위하여 CETK 테스트 를 실행 할 수 있

다 . 타겟 장치에서 연결하기 위해서는 , KITL, Microsoft ActiveSync, 또는 TCP/

IP 를 사용 하여 타겟 장치를 연결하고 , 대상 쪽의 CETK 컴포넌트를 다운로드

하고 , 윈하는 테스트를 실행하고 , 개발 워크테이션 상에서 GUI 내에서 결과를

볼 수 있다 . 다른 한편으로는 , 타겟 장치가 이 연결 옵션들을 지윈하지 않을 경

우 , 테스트를 적합한 커맨드 라인과 옵션과 함께 로컬에서 실행하여야 한다 .

CETK 워크스테이션 서버 응용프로그램 사용하기 (CETK 워크스테이션 서버 응용프로그램 )워크스테이션 서버 응용프로그램으로 작업 하기 위해서는 , 개발 컴퓨터의윈도우

임베디드 CE 6.0 프로그램 그룹에 있는윈도우 임베디드 CE 6.0 테스트 키트를

클릭한 후 , 연결 메뉴를 열고 , 시작 클라이언트 (Start Client) 명령을 선택한다 .

설정 버튼을 클릭함으로 전송을 구성한다 . 만일 , 타겟 장치가 전환되어개발 워

크스테이션으로 연결 되었을 경우 , 연결을 클릭한 후 , 윈하는 타겟 장치를 선택

한 후 , 표시하기 위하여 필요한 바이너리와 통신 채널을 설정하기 위하여 확인

버튼을 클릭한다 . CETK 응용프로그램은 이제 타겟장치 상에서 테스트를 실행

할 준비가 되었다 .

176 제 4장 디버깅 및 시스템 테스트

그림 4-11 에서 서술한 바와 같이 , CETK 응용프로그램은 자동으로 사용 가능

한 장치 드라이버를 찾아내고 , 테스트를 실행 할 수 있도록 간편한 방법을 제공

한다 . 한 가지 방법으로는 CETK 가 감지한 모든 컴포넌트를 테스트를 할 수 있

도록 테스트 메뉴에 있는 시작 / 멈춤 테스트 아래 있는 장치 이름을 클릭한다 . 다

른 방법으로는 , 테스트 목록 노드 (Test Catalog node) 를 오른쪽 마우스 버튼을

클릭하여 시작 테스트 (Start Tests) 명령을 선택하는 방법이 있다 . 단일 컴포넌

트를 테스트 하기 위해서는 개개의 컨테이너를 확장하거나 , 개인 장치를 마우스

의 오른쪽 버튼으로 클릭하거나 , 빠른 시작 (Quick Start) 을 클릭한다 . 장치 노

드를 마우스의 오른쪽 버튼을 클릭하거나 도구의 하위메뉴를 열어 워크스테이션

서버 응용프로그램은 응용프로그램 검증도구 (Application Verifier), CPU 모니

터 , 리소스 사용 (Resource Consume), 윈도우 임베디드 CE 스트레스 도구

(Stress tool) 등의 액세스를 제공한다 .

그림 4-11 CETK 응용프로그램의 그래픽 사용자 인터페이스 (GUI)

테스트 도구모음 생성 (Create a Test Suite)모든 테스트를 한 번에 실행하는 것으로 부터 또는 개별적으로 빠른 테스트를 실

행하는 것으로 부터 벗어나려면 , 소프트웨어 개발 주기에서 반복적으로 실행할

수 있는 테스트의 사용자화 계열을 포함한 테스트 도구모음을 생성하면 된다 .

새 테스트 도구모음을 생성하기 위해서는 워크스테이션 서버의 테스트 메뉴 상

태에 있는 테스트 도구모음 편집기를 사용하여 생성한다 . 테스트 도구모음 편집

기는 그래픽 도구로서 도구모음에 있는 테스트를 편리하게 선택할 수 있게 하여

준다 . 테스트 키트 도구 모음 (.tks) 의 형식에서 테스트 도구모음 정의 를 내보

내기 할 수 있고 , 모든 워크스테이션 서버 응용프로그램이 테스트의 같은 세트를

학습 3 : CETK 를 사용하여 시스템 테스트하기 177

실행하기 위하여 이 파일들을 추가 개발 컴퓨터로 가져오기 할 수 있다 . 이 .tks

파일들은 테스트 정의 아카이브를 위하여 기준으로 제공된다 .

기본 테스트 사용자화하기 (Customizing Default Tests)그래픽 사용자 인터페이스는 커맨드라인을 사용자화 함으로서 , 워크스테이션 서

버 응용프로그램이 테스트를 실행하기 위하여 테스트 엔진 (Tux.exe) 으로 전송

한다 . 테스트의 매개변수를 수정 하기 위해서는 , 테스트 목록안에 테스트를 오

른쪽 마우스 버튼으로 클릭하고 , 수정 명령 옵션 (Edit Command Line option) 을

선택한다. 예를들면, 저장 장치 블럭 드라이버 벤치마크 테스트(Storage Device

Block Driver Benchmark Test) 는 장치의 모든 섹터에 데이터를 읽고 쓰기 함

으로서 저장 장치의 성능을 분석한다 . 이 의미는 저장 장치에 현존하는 모든 데

이터를 지워버릴 수 있다는 것을 의미한다 . 데이터를 읽어버리는 것을 방지하기

위해서는 , 저장 장치 블럭 드라이버 벤치마크 테스트는 기본 테스트를 건너뛴다

. 저장 장치 블럭 드라이버 벤치마크 테스트를 성공적으로 실행하기 위해서는 커

맨드라인 수정과 특수 매개변수인 -zorch 를 명시적으로 추가하여야 한다 .

지윈되는 커맨드라인 매개변수는 개개의 CETK 테스트 구현에 의존한다 . 테스

트는 여러개의 구성 매개변수를 필요로 하거나 지윈할 수 도 있는데 , 테스트를

위한 장치 드라이버를 인식하기 위한 색인 번호나 또는 테스트를 실행하기 위한

추가 등이다 .

참고 CETK 테스트를 위한 커맨드라인 매개변수

커맨드라인 매개변수와 같은 CETK 테스트의 모든 목록의 추가정보를 위해서는 , MICROSOFT MSDN 웹사이트의 http://msdn2.microsoft.com/en-us/library/ms893193.aspx , 윈도우 임베디드 CE 6.0 문서에 있는 “CETK 테스트”를 참조하라 .

수동으로 Clientside.exe 실행하기

만일 런타임 이미지에윈도우 임베디드 CE 테스트 키트 목록 항목을 포함 시켰거

나 , 워크스테이션과 서버와 함께 CETK 컴포넌트를 다운로드 하였거나 , 파일 뷰

어 윈격 도구를 사용하여 개발 워크스테이션에서 컴포넌트를 내보내기를 하거나 ,

Clientside.exe 를 타겟장치 상에서 시작하여 워크스테이션 서버에 수동으로 연결

을 설치한다 . 만일 , 타겟장치가 이 목적을 위하여 실행 대화상자를 제공하지 않

을 경우 , 플랫폼 빌더 IDE (Platform Builder IDE) 에서 대상 메뉴를 열고 , 프로

그램 실행을 선택한 후 , Clientside.exe 를 선택한 다음 실행을 선택한다 .

Clientside.exe 는 특정 워크 스테이션 서버 응용프로그램에 연결 하거나 , 설치

된 드라이버를 감지하고 , 자동으로 테스트를 실행하도록 다음과 같은 매개변수

를 지윈한다 .

178 제 4장 디버깅 및 시스템 테스트

Clientside.exe [/i=<Server IP Address> | /n=<Server Name>] [/p=<Server Port Number>] [/a]

[/s] [/d] [/x]

Wcetk.txt file 또는 HKEY_LOCAL_MACHINE/Software/Microsoft/CETT 레

지스트리 키에서 이 매개변수를 정의 할 수 있는 것을 아는 것이 중요한데 , 그럼

으로 명령을 매개변수없이 Clientside.exe 로 시작 할 수 잇다 . 이 경우 ,

Clientside.exe 는 루트 디렉터리에서 Wcetk.txt 를 검색한 후 , 타겟 장치상의 윈

도우 디렉터리에서 검색한 후 , 개발 워크스테이션상에서 디렉터리를 릴리스 한

다 . 만일 , Wcetk.txt 가 이 위치상에서 존재하지 않는다면 , CETT 레지스트리

키를 검색한다 . 표 4-5 는 Clientside.exe 매개변수를 요약한 것이다 .

표 4-5 Clientside.exe 시작 매개변수

Command

Line

Wcetk.txt CETT Registry Key Description

/n SERVERNAME ServerName (REG_SZ)

호스트 서버 이름 지정 . /i 를 동시에 사용 못 함 과 해상도를 위한 . 시스템 도메인 이름 (DNS) 필요

/i SERVERIP ServerIP (REG_SZ) 호스트 IP 주소 지정 /n/i 를 동시에 사용하지 못 함

/p PORTNUMBER PortNumber (REG_DWORD)

워크스테이션 서버 인테페이스로 구성 할 수 있는 서버 포트 지정 .

/a AUTORUN Autorun (REG_SZ) (1) 로 설정되면 , 연결이 설치된 후 장치는 자동으로 테스트를 시작한다

/s DEFAULTSUITE DefaultSuite (REG_SZ)

실행하기 위한 기본 테스트 도구모음의 이름을 지정

/x AUTOEXIT Autoexit (REG_SZ) (1) 로 설정되면 , 테스트가 완료되면 응용프로그램은 자동으로 종료된다 .

/d DRIVERDETECT DriverDetect (REG_SZ)

(0) 로 설정되면 장치의 드라이버 감지는 비활성화 된다 .

학습 3 : CETK 를 사용하여 시스템 테스트하기 179

독립 모드에서 CETK 테스트 실행Clientside.exe 는 개발 워크스테이션에서 CETest.exe 로 연결되며 , 연결을 사

용할 수 없는 장치에서 유용하게 CETK 테스트를 연결없이 실행 할 수 있도록

하여준다 . 만일 , 런타임 이미지에윈도우 임베디드 CE 테스트 키트 카탈로그 항

목을 포함 시키려고 하면 , 로그 파일에서 테스트 결과를 추적 할 수 있는 Kato

로깅 엔진 (Kato.exe) 을 암시적으로 시작할 수 있도록 테스트 엔진 (Tux.exe)

을 시작한다 . 예를들면 , 마우스 테스트 (mousetest.dll) 를 실행하고 결과를

test_results.log 라는 파일에서 추적하기 위해서는 다음과 같은 커맨드라인을

사용 할 수있다 .

Tux.exe -o -d mousetest -f test_results.log

참고 Tux 커맨드 라인 매개변수

TUX.EXE 커맨드라인 매개변수를의 모든 목록을 위해서는 MICROSOFT MSDN 웹사이트 http://msdn2.microsoft.com/en-us/library/aa934656.aspx 의 윈도우 임베디드 CE 6.0 문서에 있는“TUX커맨드라인 매개변수” 섹션을 참조 한다 .

사용자화된 CETK 도구 테스트 솔루션 생성하기CETK 은 여러 테스트를 포함하고 있는데 , 기본 테스트는 테스팅에 필요한 모든

사항을 내포하고 있지는 않다 . 특별히 사용자화된 장치 드라이버를 BSP 에 추

가하려면 , 사용자화된 장치 드라이버를 위한 사용자 - 정의된 테스트를 구현하

는 옵션을 제공하기 위해서는 CETK 는 Tux 프레임워크에 의존한다 . 플랫폼

빌더는 몇 번의 마우스 클릭으로 골격 Tux 모듈을 생성하기위한 WCE TUX DLL

템플릿을 포함하고 있다 . 드라이버를 실행하기 위해서 로직 (logic) 을 구현 할

때 , 현재의 테스트 구현의 소스 코드를 컴토하여 보는 것이 용이하다 . CETK 는

소스코드를 포함하는데 , 윈도우 임베디드 CE 공유 소스 (Shared Source) 를 위

한 설정 마법사에서 윈도우 임베디드 CE 공유 소스의 일부분으로 설치 할 수있

다 . 기본값은 %_WINCEROOT%₩Private₩Test 이다 .

사용자화된 Tux 모듈 생성하기Tux 프레임워크에 반응하는 사용자화된 테스트를 생성 하려면 , 런타임 이미지

의 OS 설계에 하위프로젝트를 추가 함으로서 윈도우 임베디드 CE 하위프로젝

트를 시작하고 WCE TUX DLL 템플릿을 선택한다 . 이 것으로 말미암아 Tux

마법사는 드라이버가 요구하는 골격을 생성하는데 사용자화 할 수있다 .

골격 Tux 모듈을 사용자화 하기위해서는 다음과 같은 파일들을 편집하여야만

한다 .

180 제 4장 디버깅 및 시스템 테스트

■ 헤더 파일 Ft.h 한 개의 함수 표 헤더와 함수 표 입력을 포함한 TUX

Function Table (TFT) 를 정의한다 . 테스트 로직을 포함한 함수 표는 함

수의 테스트 ID 와 연결한다 .

■ 소스 코드 파일Test.cpp 테스트 함수를 포함한다. 골격 Tux모듈은사용자

화된 테스트를 Tux DLL 에 추가 할 수 있는 단일 TestProc 를 포함한다 .

사용자화된 드라이버를 로드하거나 실행하기 , Kato 를 통하여 로그 작업 ,

테스트가 완료 되었을 때 Tux 테스트 엔진에 적절한 상태 코드를 반환 하기

위해서 샘플 코드로 변경한다 .

CETK 테스트 응용프로그램에서 사용자화 테스트 정의하기 골격 Tux 모듈은 완전 작동되며 , 코드 수정없이도 솔루션을 컴파일 하거나 런타

임 이미지를 빌드 할 수 있다 . 타겟 장치에서 새 테스트 함수 ( 기능 ) 를 실행하

기위해서는 , CETK 워크스테이션 서버 응용프로그램에서 사용자 - 정의된 테스

트를 구성하여야 한다 . 이 목적을 위하여 , 테스트 메뉴에서 사용자 정의된 명령

을 클릭함으로서 시작할 수 있도록 CETK 는 사용자 - 정의된 테스트 마법사를

포함한다 . 그림 4-12 는 골격 Tux 모듈을 실행하기 위하여 사용자 - 정의된 테

스트 마법사를 구성하는 것을 보여준 것이다 .

그림 4-12 사용자 -정의된 테스트 마법사에서 사용자화된 테스트 구성하기

사용자화 테스트 디버깅하기Tux 테스트는 Tux DLLs 에서 코드와 로직 구현에 의존함으로 테스트 코드를 디

버그 할 필요가 있다 . 한 가지 문제점을 집고 넘어가야 할 것은 테스트 루틴에

학습 3 : CETK 를 사용하여 시스템 테스트하기 181

서 중단점을 설정 할 수 있으나 , 코드 실행이 중단점을 멈추게 할 경우 , 워크스

테이션 서버 응용프로그램 (CETest.exe) 과 클라이언트 쪽 응용프로그램

(Clientside.exe) 사이의 연결을 잃어 버리게 된다 . 중단점 대신 디버그를 사용

하는 것을 고려 해볼 필요가 있는데 , 만일 , 디버깅 하는 동안 중단점을 꼭 사용

하여야 한다면 , 이 학습에서 언급한 바와 같이 타겟 장치상에서 독립모드

(Clientside.exe) 를 실행한다 . 오른쪽 마우스 버튼을 클릭한 다음 커맨드라인 편

집 (Edit Command Line ) 을 선택함으로 워크스테이션 서버 응용프로그램에서

필요한 커맨드라인을 표시할 수 있다 .

CETK 테스트 결과 분석하기CETK 는 골격 Tux 모듈에서 보여준것과 같이 , Kato 를 사용하여 테스트 결과

를 로그 하여야 한다 .

g_pKato->Log(LOG_COMMENT, TEXT("This test is not yet implemented."));

워크스테이션 서버 응용프로그램은 Clientside.exe 를 통하여 이 로그들을 자동

적으로 재개하며 , 개발 워크스테이션에 저장 할 수 있다 . 다른 도구를 사용하여

이 로그 파일들을 액세스 할 수 있다 . 예를들면 , 독립모드에서 CETK 을 사용한

다고 하면 , 파일 보기 윈격 도구를 사용하여 개발 워크스테이션에 로그파일을 가

져오기 할 수 있다 .

그렘 4-13 에서 서술한 것과 같이 CETK 는 C:₩Program Files₩Microsoft

Platform Builder₩6.00₩Cepb₩Wcetk 폴더에 위치한 가져오기 로그 파일을

편리하게 보기위한 일반 CETK 파서 (Cetkpar.exe) 를 포함한다 . 일반적으로 ,

이 파서는 워크스테이션 서버 응용프로그램에서 오른쪽 마우스 버튼을 클릭하고

결과 보기를 선택함으로서 시작 하거나 직접 Cetkpar.exe 를 실행하여 시작 할

수 있다 . PerfLog.dll 에 기반을 둔 특정한 성능 테스트는 쉼표로 구분된 값 (CSV)

의 형식으로 파스 할 수있으며 , 성능 테이타를 요약하기 위하여 스프레드시트에

연다 .

이 목적을 위하여 , CETK 는 한 개의 PerfToCsv 파서 도구를 포함하며 , 특수

분석 시나리오를 위하여 사용자화된 파서를 개발 할 수도 있다 . Kato 로그 파일

은 일반 문자 형식을 사용 한다 .

182 제 4장 디버깅 및 시스템 테스트

그림 4-13 CETK 테스트 결과 분석

학습 요약윈도우 임베디드 CE 테스트 키트는 확장 할 수 있는 도구로서 , 타겟 장치상에서

드라이버와 응용프로그램을 연결 모드와 독립모드에서 테스트 할 수 있게 하여

준다 . 만일 , 타겟장치가 KITL, ActiveSync, 또는 TCP/IP 연결을 지윈하지 않

을 경우 , 독립 모드에서 CETK 도구를 실행하는 것이 매우 용이하다 . 대개 , 일

반적으로 , 개발자는 타겟장치의 BSP 에 테스트 드라이버를 추가하기 위하여

CETK 를 사용한다 .

CETK 는 Tux 테스트 엔진에 의존하는데 , 이 것은 모든 테스트 DLLs 의 공통

후레임워크를 지윈한다 . Tux DLLs 은 실제의 테스팅 로직을 내포하며 , 타겟장

치에서 로드하거나 드라이버를 실행한다 . Tux DLLs 은 로그 파일에서 테스트

의 결과를 추적하기 위하여 Kato 와 인터페이스 하는데 , 사용자화된 파서나 스

프래드시트와 같은 다른 도구에서 진행하거나 , CETK 테스트 응용프로그램에서

직접 액세스 할 수 있다 .

학습 4: 부트 로더 (Boot Loader) 테스트하기 183

학습 4: 부트 로더 (Boot Loader) 테스트하기부트 로더의 일반 작업은 메모리에 커널이 로드한 후 , 장치가 전윈이 켜진 후에

OS 시작 루틴을 호출 하는 것이다 . 특별히윈도우 임베디드 CE 상에서 부트 로

더는 BSP(Board Support Package) 의 일부분일부분이며 , 핵심 하드웨어 플랫

폼 , 런타임 이미지 다운로드 , 커널 시작등을 초기화하는 것을 관리한다 . 최종

제품에 부트 로더를 포함하거나 런타임 이미지에 부트 스트랩을 하지 출시한다

해도 , 부트 로더는 개발 주기중 유용하게 쓰일 수 있다 . 또 다른 바로는 , 부트 로

더는 복잡한 런타임 이미지의 배포를 간단히 하는데 도움을 줄 수도 있다 . 부트

로더는 이더넷 , 시리얼 케이블 , DMA, 또는 USB 연결로 런타임 이미지를 다운

로드 할 수있도록 개발자의 컴퓨터를 연결함으로 개발시간을 절약 하게 하여주

는 편리한 기능이다 . 윈도우 임베디드 CE 6.0 을 위한 플랫폼 빌더에 포함된 소

스 코드를 기반으로 하여 새 하드웨어 기능을 지윈하기위한 사용화된 부트 로더

를 개발 할 수 있다 . 예를들면 , 부트 로더를 사용하여 런타임 이미지를 RAM 으

로 부터 플래시 메모리로 복사 할 수 있으며 , 이 방법은 또 다른 플래시그림 메

모리 프로그래머나 IEEE 1149.1- 호환 테스트 액세스 포트와 영역 - 스캔 기술

을 필요로하지 않는다 . 그러나 , 디버깅과 테스트 부트 로더는 복잡한 작업을 하

는데 , 커널이 로드되기 전에 실행되는 코드를 작업하기 때문이다 .

이 학습을 마친 후 , 다음과 같은 것을 실행 할 수 있다 .

■ CE 부트 로더 아키텍처 설명 .

■ 부트 로더를 위한 공용 디버깅 기술 나열 .

에상 학습 시간 : 15 분 .

CE 부트 로더 아키텍처 (Boot Loader Architecture)모호한 부트 로더에 관한 기능을 굳이 나열하자면 , 부트 로더는 직선 , 기억장치

의 불휘발성 (nonvolatile), CPU- 액세스할 수 있는 메모리에서 pre-boot 루틴

과 함께 작은 프로그램을 Bootstrap 하는 것이다 . 메모리 주소의 타겟 장치에서

부트 로더 이미지 설치는보드 제작사가 제공하는 JTAG 프로브에 의하여 설치되

어 있는 모니터 프로그램을 통하여 CPU 는 코드를 불러오기 시작하고 , 부트 로

더는 전윈을 켜거나 시스템을 재 설정 할때 실행 된다 . 일반적으로 부트 로더 작

업은 이 단계에서 Central Processing Unit (CPU) 를 초기화 , 메모리 제어기 ,

시스템 시계 , Universal Asynchronous Receiver/Transmitters (UARTs), 이

더넷 제어기 , 사용 가능한 다른 하드웨어 장치 , 런타임 이미지 다운로딩과 이것

을 바이너리 이미지 빌더 (BIB) 레이아웃에 의하여 RAM 에 런타임 이미지를 복

사 , 하는 것과 StartUp 함수 ( 기능 ) 로 커너 뛰는 것을하는 것을 포함 한다 . 마

184 제 4장 디버깅 및 시스템 테스트

지막 런타임 이미지는 기록은 이 기능 ( 함수 ) 의 시작 주소를 포함한다 . StartUp

함수는 커널 초기화 루틴을 호출 함으로서 부트 프로세스를 계속 진행한다 .

그림 4-14 에서 서술한 바와 같이 여러 부트 로더가 실행하는 작업 과 복잡한 다

른 작업을 이행 함에 도 불구하고 , 부트 로더 개발을 용이하게 하기 위하여 공통

적인 특성을 윈도우 임베디드 CE 가 정적인 라이브러리에서 커버한다 . 부트 로

더의 아키텍처에 관한 영향은 어떻게 부트 로더 코드를 디버그 하느냐에 달려있

다 . 부트 로더 개발에 관한 자세한 사항은 제 5 장 , “보드 지윈 팩키지 사용자

화 하기” 에서 찾아 볼 수 있다 .

그림 4-14 윈도우 임베디드 CE 부트 로더 아키텍처

윈도우 임베디드 CE 부트 로더는 다음과 같은 코드 부분과 라이브러리에 아키

텍처 기반을 두고 있다 .

■ BLCOMMON 빠른 실행을 위하여 플래시 메모리에서 RAM으로 부트 로더

를 복사하기 , 이미지파일 내용 디코딩하기 , checksums 를 확인하기 , 로드

진행을 추적하기 위한 기본 부트 로더를 구현 . BLCOMMON 는 지정된 하

드웨어 사용자화를 처리하기 위하여 잘 정의된 OEM 함수를 진행토록 호출

한다 .

■ OEM code 이 코드는 BLCOMMON 라이브러리를 지윈하기 위하여 , 하드

웨어 플랫폼을 구현하여야 한다 .

■ Eboot 이더넷 연결을 통해 런타임 이미지를 다운로드 할 수 있는

Dynamic Host Configuration Protocol (DHCP), Trivial File Transfer

Protocol (TFTP), 과 User Datagram Protocol (UDP) 서비스를 제공한다.

■ Bootpart 부트 로더가 바이너리 ROM 이미지 파일 시스템 (BinFS) 분할을

생성하고 같은 저장 장치에서 다른 파일 시스템 분할을 할 수 있는 저장 분

할 루틴을 제공한다 . Bootpart 역시 부트 매개변수를 저장하기 위한 부트

분할을 생성할 수 있다 .

학습 4: 부트 로더 (Boot Loader) 테스트하기 185

■ Network drivers 기본 설치를 캡술화하여 여러 일반 네트워크 제어 장치

의 프리미티브 (primitives) 를 액세스할 수 있다 . 라이브러리를 위한 인터

페이스는 일반 인터페이스인데 , 그럼으로 , 부트 로더와 OS 는 인터페이스

를 사용 할 수 있다 . 부트 로더는 런타임 이미지를 다운로드 하기 위하여 인

터페이스를 사용하고 OS 는 인터페이스를 사용하여 플랫폼 빌더에 KITL 연

결을 구현한다 .

부트 로더를 위한 디버깅 기술부트 로더는 일반적으로 두 개의 구분된 부분으로 구성되어 있다 . 처음 부분은

어셈블리 언어로 되어있고 C 언어로 쓰여있는 두 번째 부분으로 건너뛰기 전에

시스템을 설치한다 . 만일 , 4-14 에서 서술한 바와 같이 BLCOMMON- 에 기반

을 둔 아키텍처를 사용한다면 , 어셈블리 코드를 디버그 할 필요는 없다 . 만일 장

치가 UART 를 장착하고 있으면 , C 코드에서리테일 MSG 매크로를 사용하여

테이타를 시리얼 출력 인터페이스를 사용하여 사용자가 표시 할 수 있도록 전송

할 수 있다 .

경우에 따라서 어셈블리 또는 C 코드를 디버그 하기위해서는 , 다음과 같은 서로

다른 디버깅 기술이 사용 가능하다 .

■ Assembly code 처음 시작 코드를 위한 일반 디버깅 기술은 LEDs 에 의존

하는데 , 시리얼 통신 인터페이스를 위한 7- 세그먼트 LEDs 와 UARTs 디

버깅 보드와 같은 것에 의존 하는데 , 왜냐하면 상대적으로 간단하게 일반 목

적 입력 / 출력 (General Purpose Input/Output (GPIO)) 를 액세스 할 수 있

고 , 한 개의 입력 / 출력 줄의 상태를 등록 하거나 수정 할 수 있기때문이다 .

■ C Code C-코드 수준에서 디버깅은 훨씬 쉬운데, 왜냐하면, 사용자는 고급

통신 인터페이스와 디버깅 매크로를 액세스 할 수 있기때문이다 .

■ Assembly and C code 만일 하드웨어 디버그 (JTAG probe) 가 사용 가능

되어있으면 , 플랫폼 빌더를 사용하여 eXDI 드라이버와 접속함으로서 부트

로더를 디버그 할 수 있다 .

시험 팁

인증 시험에 합격하기 위해서는 , 부트로더 , 커널 , 장치 드라이버 , 응용프로그램을 디버그하는 여러가지 기술들을 알아야한다 .

186 제 4장 디버깅 및 시스템 테스트

학습 요약부트 로더를 디버깅 하는 것은 매우 복잡한 작업이므로 , 하드웨어 플랫폼에 관하

여 깊은 이해가 필요하다 . 만일 , 하드웨어 디버그가 사용이 가능하다면 , 하드

웨어지윈 디버깅을 위하여 eXDI 와 함께 플랫폼 빌더를 사용 할 수 있다 . 그렇

지 않으면 , C 코드에서 시리얼 통신 인터페이스를 통해 디버깅 어셈블리 코드와

C 스타일 매크로의 디버그 메시지를 출력하기 위하여 LED 보드를 사용하는 것

을 고려해 보는 것도 좋을 것이다 .

학습 4: KITL, Debug Zones, 와 CETK 도구를 사용하여 시스템 디버깅과 테스팅하기 187

학습 4: KITL, Debug Zones, 와 CETK 도구를 사용하여 시스템 디버깅과 테스팅하기

이 학습에서 , Device Emulator BSP 상에 있는 OS 디자인에 디버그 콘솔 응용

프로그램을 하위프로젝트로 추가한다 . 디버깅을 사용하기 위해서는 , 런타임 이

미지에 KdStub 와 KITL 를 포함 시키고 , 해당 타겟 장치 연결 옵션을 설정한다 .

디버그 영역을 지윈하기 위한 구현을 위해 콘솔 응용프로그램의 소스 코드를 수

정하고 , Pegasus 레지스트리 키에서 유용하게 실행 할 수 있는 디버그 영역을

지정하고 , 비주얼 스튜디오 의 출력 창에 서 디버그 메시지를 검토하기 위하여

커널 디버거를로 타겟 장치에 연결한다 . 후 반에는 , CETK 를 사용하여 런타임

이미지에 포함되어 있는 마우스 드라이버를 테스트 한다 . 비주얼 스튜디오 에

서 기본 OS 디자인을 생성하기 위해서는 , 학습 1 에 요약되어 있는 “OS 디자인

생성 , 구성 , 빌딩” 의 프로세스를 따라한다 .

참고 상세한 단계별 지침

이 학습에서 보여준 진행을 성공적으로 습득하기 위해서는 이 책의 부록 “학습 4 를 위한 상세한단계별 지침” 문서를 참조하라 .

� KITL 활성화와 디버그 영역 사용하기

1. 학습 1에서비주얼 스튜디오 에서 생성한 OS design project를 연 후, OS 디

자인 속성을 편집하기 위하여 OSDesign 이름을 마우스의 오른쪽 버튼으로

클릭하고 Properties 를 선택한다 . 구성된 Properties 를 선택한 후 옵션을

빌드한다 . 런타임 이미지를 위한 Enable KITL 확인란을 선택한다 .

2. OS 디자인 속성 페이지대화 상자에서 커널 디버거 기능을 활성화 하고 , 변

경을 적용하고 대화 상자를 닫는다 .

3. 현재의 디버그 빌드 구성 작업에서 이전의 단계에서 유효화한 커널 디버거

와 KITL 컴포넌트가 빌드 이미지에 포함 되어있는지 확인한다 .

4. 빌드 메뉴에서 고급 빌드 명령 (Advanced Build Commands) 아래있는 현

재 BSP 재 빌드 (Rebuild Current BSP) 와 하위프로젝트를 선택하여 OS

디자인을 빌드한다 ( 만일 다음 단계에서 오류가 발생 할 경우 Clean Sysgen

를 실행한다 ).

5. 대상 메뉴를 열고 타겟장치 연결 옵션 대화상자를 표시하기 위한 연결 옵션

을 클릭한다 . 다음과 같은 설정을 한 후 확인을 클릭한다 .

188 제 4장 디버깅 및 시스템 테스트

6. 하위프로젝트를 OS 디자인에 추가 한 후 WCE 컨솔 응용프로그램 템플릿

(WCE Console Application template) 을 선택한다 . 프로젝트를

TestDbgZones 로 명명한 후 하위프로젝트 마법사에 있는” A Typical

Hello World Application” 옵션을 선택한다 .

7. 하위프로젝트에 새로운 헤더 파일 DbgZone.h 를 추가한 후 다음과 같은 영

역을 정의한다 .

#include <DBGAPI.H>

#define DEBUGMASK(n) (0x00000001<<n)

#define MASK_INIT DEBUGMASK(0)

#define MASK_DEINIT DEBUGMASK(1)

#define MASK_ON DEBUGMASK(2)

#define MASK_ZONE3 DEBUGMASK(3)

#define MASK_ZONE4 DEBUGMASK(4)

#define MASK_ZONE5 DEBUGMASK(5)

#define MASK_ZONE6 DEBUGMASK(6)

#define MASK_ZONE7 DEBUGMASK(7)

#define MASK_ZONE8 DEBUGMASK(8)

#define MASK_ZONE9 DEBUGMASK(9)

#define MASK_ZONE10 DEBUGMASK(10)

#define MASK_ZONE11 DEBUGMASK(11)

#define MASK_ZONE12 DEBUGMASK(12)

#define MASK_FAILURE DEBUGMASK(13)

#define MASK_WARNING DEBUGMASK(14)

#define MASK_ERROR DEBUGMASK(15)

#define ZONE_INIT DEBUGZONE(0)

#define ZONE_DEINIT DEBUGZONE(1)

#define ZONE_ON DEBUGZONE(2)

#define ZONE_3 DEBUGZONE(3)

#define ZONE_4 DEBUGZONE(4)

#define ZONE_5 DEBUGZONE(5)

#define ZONE_6 DEBUGZONE(6)

#define ZONE_7 DEBUGZONE(7)

#define ZONE_8 DEBUGZONE(8)

#define ZONE_9 DEBUGZONE(9)

#define ZONE_10 DEBUGZONE(10)

#define ZONE_11 DEBUGZONE(11)

#define ZONE_12 DEBUGZONE(12)

#define ZONE_FAILURE DEBUGZONE(13)

매개변수 구성 설정

Download Device Emulator (DMA)

Transport Device Emulator (DMA)

Debugger KdStub

학습 4: KITL, Debug Zones, 와 CETK 도구를 사용하여 시스템 디버깅과 테스팅하기 189

#define ZONE_WARNING DEBUGZONE(14)

#define ZONE_ERROR DEBUGZONE(15)

8. TestDbgZones.c 파일의 include 에 DbgZone.h 헤더 구문을 추가 한다 .

#include "DbgZone.h"

9. 다음과 같이 _tmain 함수위의 디버그 영역을 위한 dpCurSettings 변수를

정의한다 .

DBGPARAM dpCurSettings =

{

TEXT("TestDbgZone"),

{

TEXT("Init"), TEXT("Deinit"), TEXT("On"), TEXT("n/a"),

TEXT("n/a"), TEXT("n/a"), TEXT("n/a"), TEXT("n/a"),

TEXT("n/a"), TEXT("n/a"), TEXT("n/a"), TEXT("n/a"),

TEXT("n/a"), TEXT("Failure"), TEXT("Warning"), TEXT("Error")

},

MASK_INIT | MASK_ON | MASK_ERROR

};

10. _tmain 함수의 첫 줄에 모듈의 디버그 영역을 등록한다 .

DEBUGREGISTER(NULL);

11. 리테일 MSG 와 DEBUGMSG 매크로를 사용하여 다음과 같이 디버그 영역

과 연결 하고 디버그 메시지를 표시한다 .

DEBUGMSG(ZONE_INIT,

(TEXT("Message : ZONE_INIT")));

³ÆÝÞ¿œMSG(ZONE_FAILURE || ZONE_WARNING,

(TEXT("Message : ZONE_FAILURE || ZONE_WARNING")));

DEBUGMSG(ZONE_DEINIT && ZONE_ON,

(TEXT("Message : ZONE_DEINIT && ZONE_ON")));

12. 응용프로그램을 빌드하고 , 타겟 장치에 연결한 다음 , 타겟 제어 창을 사용하

여 응용프로그램을 시작한다 .

13. 디버그 출력 창에서는 첫 디버그 메시지만 표시된다는 것을 명심 하여야한

다 .

4294890680 PID:3c50002 TID:3c60002 Message : ZONE_INIT

14. 남아있는 디버그 영역을 기본값으로 활성화하기 위하여 레지스트리 편집기

(Regedit.exe) 를 연다 .

15. HKEY_CURRENT_USER₩Pegasus₩Zones 키를 열고 REG_DWORD 값

을 생성하여 TestDbgZone(dpCurSettings 변수에서 모듈의 이름을 정의 )

를 호출한다 .

190 제 4장 디버깅 및 시스템 테스트

16. 32 비트 DWORD 값의 낮은 16 비트와 일치하는 16 개의 명명된 영역의 값

을 0xFFFF 값으로 설정하여 활성화한다 . ( 그림 re 4-15 참조 ).

17. 비주얼 스튜디오에서 , 응용프로그램을 재 실행하면 다음과 같은 출력을 볼

수 있다 .

4294911331 PID:2270006 TID:2280006 Message : ZONE_INIT

4294911336 PID:2270006 TID:2280006 Message : ZONE_FAILURE || ZONE_WARNING

4294911336 PID:2270006 TID:2280006 Message : ZONE_DEINIT && ZONE_ON

18. 비주얼 스튜디오의 출력 창에서 결과를 확인하거나 , 다른 디버그 영역을 활

성화 하거나 비활성화 하기 위하여 레지스트리에서 TestDbgZone 값을 변

경한다 .

그림 4-15 HKEY_CURRENT_USER₩Pegasus₩Zones: "TestDbgZone"=dword:FFFF

참고 플랫폼 빌더에서 디버그 영역을 활성화와 비활성화 하기

플랫품 빌더에서 TestDbgZone 모듈을 위하여 디버그 영역을 제어 할 수는 없는데 왜냐하면 , 이 모듈을 위한 응용프로그램 진행은 유효한 영역을 열거나 수정하기전에종료되기 때문이다 . 유일하게 디버그 영역을 관리 할 수 있는 방법은 그래픽 응용프로그램이나 DLL 을 위하여 플랫폼 빌더에 모듈을 로드하는 것이다 .

학습 4: KITL, Debug Zones, 와 CETK 도구를 사용하여 시스템 디버깅과 테스팅하기 191

� CETK 를 사용하여 마우스 드라이버 테스트 실행하기

1. 개발 컴퓨터상에서 시작 메뉴로 부터 Windows CE 테스트 키트 응용프로그

램을 연다 . ( 윈도우 임베디드 CE 6.0 메뉴를 연 후윈도우 임베디드 CE 테

스트 키트를 클릭한다 ).

2. 윈도우 임베디드 CE 테스트 키트 창에서 , 연결 메뉴를 열고 타겟장치에 연

결을 설치하기 위하여 클라이언트 시작 (Start Client ) 을 클릭한다 .

3. 연결을 클릭한 후 연결 관리자 창에서 장치를 선택한다 .

4. 그림 4-16 에서 보는 바와 같이 장치에 워크스테이션 서버 응용프로그램이

성공적으로 연결 되는지 확인 , 필요한 CETK 바이너리를 배포 , 사용가능 한

장치 드라이버 감지 , 계층적 트리에서 모든 컴포넌트의 목록을 표시하는지

확인한다 .

5. Windows CE 테스트 목록 노드를 마우스의 오른쪽 버튼으로 클릭한 후 모

든 테스트 해제를 클릭한다 .

6. 목록에서 개개의 노드를 열고 마우스 테스트 확인란을 선택한다 .

7. 테스트 메뉴를 열고 시작 / 멈춤 테스트를 클릭 함으로서 마우스 테스트를 실

행한다 .

8. 타겟 장치상에서 필요한 마우스 동작을 선택한다 .

9. 테스트가 종료되었으면 테스트 입력을 마우스의 오른쪽 버튼을 클릭하고 결

과 보기를 선택함으로서 테스트의 보고서를 액세스 할 수 있다 .

10. CETK 파서에서 결과를 검토함으로서 , 성공을 알림 , 건너뛰기 , 테스트 프로

시저를 검토 할 수 있다 .

그림 4-16 윈도우 임베디드 CE 테스트 키트 창의 장치 목록

192 이 장의 복습

이 장의 복습윈도우 임베디드 CE 를 위한 플랫품 빌더는 디버깅을 쉽게 이해 할 수 있는 세트

와 도구를 제품을 릴리스 하기전에 최종 시스템 구성 확인과 에러를 유발 시키는

윈인을 분석하고 제거할 수 있는 테스팅 도구를 포함하고 있다 . 디버깅 도구는

비주얼 스튜디오 와 융합되어 KITL 연결을 통하여 타겟장치와 통신한다 . 다른

방법으로는 , 메모리 덤프 (memory dump) 를 생성하여 CE Dump File Reader

를 사용하여 오프라인 모드에서 시스템을 디버그 할 수 있고 , 특정한 사후 디버

깅을 할때 매우 유용하다디버깅 환경은 확장 할 수 있는데 , 그 의미는 eXDI 드라

이버가 표준 커널 디버거의 한계를 뛰어 넘어 하드웨어 지윈 디버깅을 실행하는

것이다 .

커널 디버거는 커널 컴포넌트와 응용프로그램을위한 혼합된 디버거이다 . 만일

KdStub 와 KITL 을 활성화 하여 타겟장치에 연결한다면 , 디버깅은 자동으로 시

작된다 . 사용자는 타겟 제어 창을 사용하여 디버깅과 CEDebugX 명령들을 기반

으로 하는 고급 시스템 테스트를 실행하는 응용프로그램을 시작 할 수 있다 . 그

러나 , 명심 하여야 할 것은 이 레벨로 인하여 중단 처리기 또는 OAL 모듈에서 중

단점을 설정 할 수 없거나 , 커널은 단일 - 스레드 모드로 작동하고 , 만일 코드 실

행이 멈춤으로 되면 , 개발 워크스테이션과의 통신을 멈춘다 . 중단 처리기를 디

버그하기 위해서는 , 하드웨어 디버거 또는 디버그 메시지들을 사용한다 . 디버그

메시지 기능은 런타임 이미지를 재 빌드하지 않고 정보 출력을 제어 할 수있도록

디버그 영역을 지윈한다 . 디버그 메시지를 사용하여 부트 로더에서 C- 코드 부

분을 역시 디버그 할 수 있으며 , 어셈블리 코드 부분은 반드시 하드웨어 디버거

나 LED 패널을 사용하여야 한다

CETK 테스트 응용프로그램을 기반으로 한 시스템 테스팅을 중앙 처리화 하기

윈한다면 KITL 을 필요로 하는데 , 그럼에도 불구하고 CETK 테스트는 독립 모

드에서도 실행이 가능하다 . 만일 타겟장치를 위한 고급 BSP 를 개발하려고 한

다면 , CETK 를 사용하여 사용자화된 Tux DLLs 에서 자동 또는 반 - 자동 컴포

넌트 테스트를 실행할 수 있다 . 플랫폼 빌더는 특정한 테스트에 필요한 확장을

할 수 있는 골격 Tux 모듈 을 생성 할 수있는 WCE TUX Dynamic-Link Library

템플릿을 포함한다 . 사용자는 CETK 테스트 응용프로그램에서 사용자화된 Tux

DLL 을 구성 할 수 있고 , 각기 테스트를 실행하거나 큰 테스트 모음의 일부분으

로 실 행 할 수 있다 . 왜냐하면 , 모든 CETK 테스트는 동일한 로깅 엔진과 로그

파일 형식을 사용하기 때문인데 , 사용자는 같은 파서 (Parser) 도구를 사용하여

기본값과 사용자 - 정의된 테스트를 분석할 수 있다 .

이 장의 복습 193

주요 용어이 주요 용어가 무슨 뚯인지 아십니까 - 이 책의 끝 부분에 있는 단어장에서 용

어를 찾아봄으로써 답안을 검토 할 수 있다 .

■ 디버그 영역 (Debug Zones )

■ KITL

■ 하드웨어 디버거 (Hardware debugger)

■ dpCurSettings

■ DebugX

■ 타겟 제어 (Target Control)

■ Tux

■ Kato

추천 연습이 과에서 보여준 시험 요소들을 성공적으로 마스터하기 위해서 다음과 같은 작

업을 하여보자 .

메모리 누수 감지하기메모리 블럭을 할당하고 해제하지 않음으로 메모리 누수를 야기시키는 컨솔 응

용프로그램을 위하여 하위프로젝트를 OS 디자인에 추가한다 . 이 과에서 사용된

툴들을 사용하여 문제를 발견하고 정정한다 .

사용자화된 CETK 테스트WCE TUX Dynamic-Link Library 를 위하여 OS 디자인에 하위프로젝트를 추

가한다 . 윈도우 임베디드 CE 테스트 키트에 Tux DLL 을 빌드하고 이 것을 등록

한다 . CETK 를 실행하고 테스트의 결과를 확인한다 . Tux DLL 에서 중단점을

설정하고 독립 실행에서 CETK 테스트를 실행함으로써 코드를 디버그 한다 .