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

54
Windows Embedded CE 6.0 CTS M Exam 70-571 전매 금지. 인증 시험 준비 준비 키트( Preparation Kit) R2 콘텐츠로 업데이트

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

Page 1: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

i

Windows Embedded CE 6.0

CTSMExam 70-571

전매 금지.

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

R2 콘텐츠로

업데이트

Page 2: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

Page 3: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

iii

간단한 내용

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

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

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

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

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

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

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

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

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

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

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

Page 4: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인
Page 5: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

145

제 4 장

디버깅 및 시스템 테스트

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

이 장에서의 학습 목표 :

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

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

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

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

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

Page 6: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

지식

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

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

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

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

Page 7: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 와 같은 윈격 도구의 컬렉션을 포함

한다 .

Page 8: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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) 디버깅을 수행하기 위해 플

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

Page 9: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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) 의 기능 중 하나는

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

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

Page 10: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 디버그 정보를 기본 출력 스트림 ( 즉 , 비주얼 스튜디오의 출력 윈도우 또는 지정된 파일 ) 에 인자로 출력한다 . 이 오류 정보는 소스 코드 파일명과 행 번호를 포함한다 . 에러 메시지를 출력한 소스와 코드의 위치를 빠르게 찾을 수 있도록 해준다 .

Page 11: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 매크로

매크로 설명

Page 12: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

Page 13: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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;}

Page 14: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 메뉴를 사용하여 이용할 수 있다 .

Page 15: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 변경

Page 16: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 으로 사용할 수 있다 .

Page 17: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 을 통해 연결되어 있어야 함을 명심해

야 한다 .

Page 18: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 쉘을 통해 접근

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

Page 19: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

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

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

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

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

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

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

든 힙 객체를 진단한다 .

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

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

Page 20: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 프로세스 - 쓰레드와 비슷한 기능 , 시스템에서 실행되고 있는 프

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

준다 .

Page 21: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 이벤트 추적

Page 22: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 에서 이용할 수 있다 .

Page 23: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 툴은 윈격 커널 트랙커에 의해 나

Page 24: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

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

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

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

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

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

있다 .

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

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

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

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

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

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

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

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

Page 25: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

제 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 를 이용해 이 로그 파일을 좀더 편리하게 사용할 수 있

게 한다 .

Page 26: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 을 사용 가능하게 하면서 , 타겟 장치에

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

Page 27: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

디버깅 가능한 런타임 이미지 구성 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 이다 . 지윈된 이더넷 칩을 가지는 타겟 장치가 네트워크 인터페이스

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

Page 28: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

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

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

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

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

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

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

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

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

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

개발할 때 가장 유용하다 .

Page 29: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

디버깅 가능한 런타임 이미지 구성 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) 와 연결이 되어 있자 안을 경우 인스턴스가 없는 중단점이 발생되며 , 중단

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

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

Page 30: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

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

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

과 같다 .

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

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

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

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

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

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

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

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

멈추게 된다 .

Page 31: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

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

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

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

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

팁 중단점이 많은 경우

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

웨어 단추를 클릭한다 .

Page 32: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

번 클릭한다 .

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

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

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

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

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

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

할 수 도 있다 .

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

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

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

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

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

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

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

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

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

서 사용 가능케 한다 .

Page 33: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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) 솔루션이다 .

Page 34: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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) 을 설치 할 수 없다 .

Page 35: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 응용프로그램은 이제 타겟장치 상에서 테스트를 실행

할 준비가 되었다 .

Page 36: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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) 의 형식에서 테스트 도구모음 정의 를 내보

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

Page 37: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 는 특정 워크 스테이션 서버 응용프로그램에 연결 하거나 , 설치

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

를 지윈한다 .

Page 38: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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) 로 설정되면 장치의 드라이버 감지는 비활성화 된다 .

Page 39: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 모듈을 사용자화 하기위해서는 다음과 같은 파일들을 편집하여야만

한다 .

Page 40: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 에서 코드와 로직 구현에 의존함으로 테스트 코드를 디

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

Page 41: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 로그 파일

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

Page 42: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

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

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

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

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

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

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

CETK 를 사용한다 .

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

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

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

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

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

직접 액세스 할 수 있다 .

Page 43: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 함수 ( 기능 ) 로 커너 뛰는 것을하는 것을 포함 한다 . 마

Page 44: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 역시 부트 매개변수를 저장하기 위한 부트

분할을 생성할 수 있다 .

Page 45: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 드라이버와 접속함으로서 부트

로더를 디버그 할 수 있다 .

시험 팁

인증 시험에 합격하기 위해서는 , 부트로더 , 커널 , 장치 드라이버 , 응용프로그램을 디버그하는 여러가지 기술들을 알아야한다 .

Page 46: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

학습 요약부트 로더를 디버깅 하는 것은 매우 복잡한 작업이므로 , 하드웨어 플랫폼에 관하

여 깊은 이해가 필요하다 . 만일 , 하드웨어 디버그가 사용이 가능하다면 , 하드

웨어지윈 디버깅을 위하여 eXDI 와 함께 플랫폼 빌더를 사용 할 수 있다 . 그렇

지 않으면 , C 코드에서 시리얼 통신 인터페이스를 통해 디버깅 어셈블리 코드와

C 스타일 매크로의 디버그 메시지를 출력하기 위하여 LED 보드를 사용하는 것

을 고려해 보는 것도 좋을 것이다 .

Page 47: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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. 대상 메뉴를 열고 타겟장치 연결 옵션 대화상자를 표시하기 위한 연결 옵션

을 클릭한다 . 다음과 같은 설정을 한 후 확인을 클릭한다 .

Page 48: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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

Page 49: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 변수에서 모듈의 이름을 정의 )

를 호출한다 .

Page 50: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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 을 위하여 플랫폼 빌더에 모듈을 로드하는 것이다 .

Page 51: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

학습 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 테스트 키트 창의 장치 목록

Page 52: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

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) 도구를 사용하여

기본값과 사용자 - 정의된 테스트를 분석할 수 있다 .

Page 53: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인

이 장의 복습 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 테스트를 실행함으로써 코드를 디버그 한다 .

Page 54: 준비 키트( Preparation Kit)download.microsoft.com/download/0/B/9/0B98A0AE-C7AF... · 윈도우 임베디드 ce 지윈하는 드라이버 아키텍처의 기본적 이해 os 디자인