CH5 디버그를 해보자 2007. 8.13. 5.1 디버그 디버거 : 실행중인 응용 프로그램을 지정한 장소에서 정지하고, 그 시 점에서 변수, 메모리, 콜 스택의 내용을 참조하는것이 가능 Build -> Start Debug -> Go.

Slides:



Advertisements
Similar presentations
Computer Graphics 1 윈도우 프로그래밍 실습 II 김 창 헌김 창 헌.
Advertisements

Visual C++ 구성. DevStudio –Visual C++ 를 실행시키면 전면에 뜨는 프로그램. – 텍스트에디터, 리소스에디터, 디버거 등 모든 기능 총괄 MFC(Microsoft Foundation Class) – 윈도우 프로그램을 만드는데 필요한 거의 모든.
Visual C++ Programming Document/View Architecture Department of Digital Contents Sang Il Park.
프로젝트 보고서 학과 : 임학과 학번 : 성명 : 조성환 Windows 프로그래밍.
Visual C++ Programming Document/View Architecture
컴퓨터 공학 설계 및 실험 I MFC programming
Chapter 02. C언어 기반의 C++ 박 종 혁 교수 UCS Lab SeoulTech Tel:
Visual C++ Programming
Vision System Lab, Sang-Hun Han
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
MFC Application Frameworks (AFX)
C++ Espresso 제1장 기초 사항.
Lecture 2 MFC and Application Frameworks
Visual C++ Programming Dialog Box
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
Visual C++ Programming Document/View Architecture 3
제 1 장 영상처리 기초.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
컴퓨터 계측 및 실습 스테핑 모터 영남대학교 기계공학부.
MFC를 이용한 네트워크게임 졸업 프로젝트 담당 교수 : 김재형 교수님 김 성준 김 민기.
MFC 발전 과정과 주요 특징을 개괄적으로 이해한다.
실전 프로젝트 2 : 숫자야구 숫자 야구를 구현해보자.
윤 홍 란 MFC 기초 윤 홍 란
Windows Programming 시작하기
C++ Espresso 제9장 다형성.
스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다.
처음으로 배우는 C 프로그래밍 제2부 기초 제5장 반복문.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
범용 소켓 클래스 만들기.
컴퓨터 계측 및 실습 스테핑 모터 영남대학교 기계공학부.
졸업작품발표 타자 연습 프로그램 By.. Eunju 담당 교수 : 이형원 교수님 학번 : 이름 : 김은주.
Network Socket Programming
Microsoft Visual C++ 제 1편 입문편 5장. 샘플 프로그램의 사용자화
CH 1. MFC 전체보기 정보통신공학과 안 재 형.
명품 Java Programming.
MFC Application Frameworks (AFX)
MFC 프로그래밍에 관한 팁 / Keyboard / Timer
Visual C++ Programming Output and File
Visual C++ Programming Common Controls
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
Lecture 3 Graphics with GDI
C ++ 프로그래밍 시작.
프로그래밍2 및 실습 C언어 기반의 C++ 2.
Visual C++ Programming MFC Programming의 이해
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
날짜: 팀명: TEAM-SIX 발표자: 이기영
Chapter 3 클래스. 최호성.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
DataScience Lab. 박사과정 김희찬 (월)
Lab 4 보고서 교재 5장 사용자 인터페이스 예제 - 사용자 인터페이스 갱신
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
시스템 접속환경 설정 인터넷 옵션 설정 익스플로러 상단 메뉴 에서 을 클릭하고, 아래 순서대로 설정합니다. 1. 탭에서 을 클릭하여 “페이지 열 때마다”를 체크하고 합니다. 2. 탭을 선택하고 하단의 에.
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
ODBC &DAO 안명상.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
Windows 프로그래밍 환경 및 MFC의 구조
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 계측 및 실습 C++ 기초 영남대학교 기계공학부.
컨트롤, 프로퍼티, 이벤트.
1 2 4 &
MFC 응용 프로그램 구조 두 개의 윈도우로 구성된 일반적인 MFC 프로그램 프레임 윈도우
C++ 언어의 특징
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
발 표 자 : 7조 손 창 국 윤 오 성, 박 진 완 객체 지향 프로그래밍 C++
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
제 4장 Visual C++ COM 컴파일러.
Presentation transcript:

CH5 디버그를 해보자

5.1 디버그 디버거 : 실행중인 응용 프로그램을 지정한 장소에서 정지하고, 그 시 점에서 변수, 메모리, 콜 스택의 내용을 참조하는것이 가능 Build -> Start Debug -> Go

5.1 디버그 코딩 중에는 프로젝트 구성 Debug 를 이용, 완성 후에는 프로젝트 구 성 Release 를 이용. - Debug 구성과 Release 구성 - 설정 항목 DebugRelease 출력 디렉토리 DebugRelease 프리프로세서의 정의 _DubugNDBUG 디버그 정보생성한다생성하지 않는다 최적화하지 않는다한다 ( 실행 속도 우선 ) 프로젝트 구성 Debug 와 Release 의 차이

5.1 디버그 IDC_FILENAM E IDC_TEXT IDC_OPEN

5.1 디버그 ( : : GetDlgItem 멤버의 CWnd* 형의 반환값을 Cedit 형으로 캐스트하고 이것에서 GetWindowText 멤버 함수를 참조

5.1 디버그 Build -> Start Debug -> Go 이상한 것이 들어있다.

5.1 디버그 이곳이 브레이크 포인트 변수 윈도

5.1 디버그 스텝 인 : 프로그램 카운터 위치에 함수 호출이 있으면, 그 함수 안으로 도 프로그램 카운터를 진행 시킨다. 스텝 오버 : 프로그램 카운터를 1 행 진행시킨다.( 함수 호출이 있으면 그 함수의 처리가 종료된 시점 까지 프로그램 카운터를 진행시킨다. 스텝 아웃 : 프로그램 카운터 위치의 함술가 종료되는 곳까지 프로그램 카운터를 진행시킨다.

5.1 디버그 - IDC_TEXT 에디트 박스에 텍스트를 사용하기 위해 CEdit::SetWindowText 멤버 함수를 사용하고 있지만, 이 멤버 함수는 LPCTSTR 형의 인수를 하나 취하여, 이 것으로 지정된 메모리의 내용을 에디트 박스에 삽입 - 이 인수가 끝에 ‘\0’ 을 갖는 문자열을 요구

5.2 디버그 지원 함수 - 메모리 리크 - 메모리 리크란 어디에서도 참조하고 있지 않음에도 불구하고, 해제 ( 해방 ) 되 지 않고 그냥 방치되어 있는 메모리가 존재 { };{ } at, bytes long 확보한 메모리에 대한 포인터는 포컬 변수 p 에 저장되어 있는데, 이 메모리를 해제하는 delete 연 산자가 없기 때문에 CBugDlg::OnOpen 멤버 함수가 종료되는 시점에서 메모리 리크가 발생

5.2 디버그 지원 함수 AfxSetAllocStop 함수 : 루프속에서 메모리를 확보하는 경우, 2 회째 이후 에 메모리 리크가 발생되기도 하고, 특정 개체를 체크하여 대화상자를 닫 을 때에만 리크되기도 하고, 조건이 해당될 때에만 리크가 바생해도 이러 한 조건을 메시지에서 읽어들일 수 없음을 보완하는 함수 - 메모리 리크의 순간 - void AfxSetAllocStop(LONG IRequestNumber) 인수 LONG IRequestNumber 는 리퀘스트 넘버를 지정 ex) 리퀘스트 번호 58 로 메모리 리크가 발생될 경우 AfxSetAllocStop(58); 리퀘스트 번호에 대응하는 메모리의 확보가 시행된 순간에 브레이크 포인트를 발견하 도록 실행을 정지시켜, 디버거로 조사를 시작할 수 있음

5.2 디버그 지원 함수 CMemoryState 클래스 : 어느 시점에서의 메모리의 상태 (Snap Shot) 를 파악하여 메모리 리크를 검출하는 클래스 - 스냅 숏 (Snap Shot) - 멤버 함수처리 void CMemoryState::Checkpoint() 스냅 숏을 갖는다. BOOL CMemoryState::Difference(const CMemoryState& oldState, const Cmemory State& newState) 2 개의 스냅 숏의 차 이를 평가한다. void CMemoryState::DumpStatistics() 스냅 숏의 내용을 표 시한다. CmemoryState 클래스의 멤버 함수

5.2 디버그 지원 함수 CMemoryState begin, end, diff; begin.Checkpoint();// 이 시점에서의 메모리 확보 상황의 스냅숏을 // begin 으로 한다..... // 이 범위에서는 new 와 delete 의 관계가 열려 있는 것으로 한다..... end.Checkpoint();// 이 시점에서의 스냅 숏을 end 로 한다. if (diff.Difference.(begin,end)) { // CMemoryState::Difference 는 차이가 있으면 TRUE 를 반환한다. diff.DumpStatistics();// 차이를 표시한다. } 0 Bytes in 0 Free Blocks. 294 bytes in 1 Normal Blocks. 0 bytes in 0 CRT Blocks. 0 bytes in 0 Ignore Blocks. 0 bytes in 0 Client Blocks. Largest number used :: 1054 bytes. Total allocations:;1124 bytes. 블록형목적 Free Blocks 해제된 메모리 블록 ( 나중에 설명 ) Normal Blocks char 나 int 와 같은 기본형이나 CObject 클래스를 계승하고 있지 않은 클래스를 위해 확보된 메모리 블록 CRT Blocks C 랜덤 라이브러리 안에서 확보된 메모리 블록 Ignore Blocks 메모리 리크 검출 기구를 오프로 하고 있 을 때에 확보된 메모리 블록 Client Blocks CObject 클래스 및 그 파생의 개체를 위 해 확보된 메모리 블록 메모리 리크가 발생했을 때 CmemoryState::DumpStatistics 멤버 함수에 의해 차이의 상황이 아웃풋 윈도에 나타남 3 개의 멤버함수는 다음과 같이 조합하여 사용 블록형

5.2 디버그 지원 함수 - ASSERT (BOOL expression) ex) ASSERT(p != NULL); - 진단 함수 - 정확하게 동작되는 한 참이 되는 조건식을 지정한다. 식의 진단 (ASSERT 매크로, VERIFY 매크로 ) ASSERT(i++ !=0)VERIFY(i++ !=0) 디버그 환경 Assert(i++ !=0) 릴리즈 환경없음 i++ !=0 ASSERT 매크로와 VERIFY 매크로의 차이 요소 요소에 실행시의 정당성을 확인하는 체크 포인트를 설정하여 두는 방법 Ex) 포인터의 계산이 끝난 시점에서 포인터가 지시하는 메모리에 원하는 데이터가 존재 하는지 체크

5.2 디버그 지원 함수 class CAssertTest::public CObject // CObject 클래스의 직접 // 또는 간접 파생 클래스를 만든다 { Protected: CFile* f; UINT len; Public:.. #ifdef _DEBUG // AssertValid 멤버 함수는 디버그 환경에서만 정의되므로 // #ifdef 로 둘러쌀 필요가 있다. Vitrual void AssertValid() const; #endif }; - 클래스 개체의 진단 (CObject::AssertValid 멤버함수 ) - virtual void CObject:: AssertValid() const; ASSERT_VALID 매크로를 사용하면, 클래스 개체로 포인터를 넘기면 그 개체에 대해 진단을 실행 목적 클래스에 AssertValid 함수를 갖추고, ASSERT_VALID 매크로에 의해 호출 CObject 클래스의 파생클래스 AssertValid 멤버 함수의 정의를 #ifdef _DEBUG ~ #endif 로 둘러쌈

5.2 디버그 지원 함수 #ifedf _DEBUG// 함수의 실장 전체를 #ifdef ~ #endif 로 둘러싼다 void CAssertTest::AssertValid() const { CObject::AssertValid; // 기저 클래스인 Cobject 클래스의 AssertValid 멤버 함수를 호출한다. if (f!=NULL) { ASSERT_VALID(f); // CFile 클래스 개체를 진단하기 위해 // CFile::AssertValid 멤버 함수를 호출한다. ASSERT(f->GetLength()==len); } #endif

5.2 디버그 지원 함수 - CObject::Dump 멤버 함수 클래스 개체를 인간이 읽을 수 있는 형태로 출력하는 표준적인 방법 virtual void CObject::Dump(CDumpContext& dc) const; class CAssertTest::public CObject// CObject 클래스의 직접 // 또는 간접 파생 클래스를 만든다. { protected: CFile* f; UINT len; public:.... #ifdef _DEBUG // Dump 멤버 함수는 디버그 환경에서만 정의되므로 // #if def 로 둘러쌀 필요가 있다. ~ Virtual void Dump(CDumpContext& dc) const #endif };

5.2 디버그 지원 함수 #ifdef _DEBUG void CDumpTest::Dump(CDumpContext& dc) const { CObject::Dump(dc); dc << f; dc << “file lenggth : “ << len; } #endif }; void CDumpTest* = new CDumpTest; #ifdef _DEBUG afxDump << p; #endif

CH6 MFC 6.0 과 ClassWizard

6.1 MFC 의 계층구조 CObject 에서 파생하지 않는 클래스

6.1 MFC 의 계층구조

CObject CMenu CDocTemplate CCmdTarget CDocument CDC CWndCWinThreadCPaintDCCClientDC CMDIChildWndCMDIFrameWnd CViewCFrameWnd CDialo CWinApp

6.2 CCmdTarget 과 그 파생클래스 - MFC 라이브러리 메시지 맵 아키텍쳐를 위한 base class - CCmdTarget 을 상속받은 프레임워르 클래스에는 CView, CWinApp, CDocument, CWnd, CFrameWnd 등 이 있 다. - 메시지를 처리하기 위해 새로운 클래스를 만들면 CCmdTarget 로부터 상속받은 클래스 중의 하나를 상속받으면 된다.

6.2 CCmdTarget 과 그 파생클래스 MFC 라이브러리의 모든 윈도우 클래스의 기본 기능을 제공한다. CWnd 의 개체는 CWnd 생성자와 소멸자에 의해 생성되고 제거된다. CWnd 클래스는 자식 윈도우를 생성할 수 있도록 해준다. 들어오는 윈도우즈 통지 메시지는 메시지 맵을 돌면서 자동으로 적절한 On+Message CWnd 멤버 함수에 맵핑된다. 상속받은 클래스에 서 특정한 메시지를 다루는 On+Message 멤버 함수를 오버라이드 한다 특정 윈도우 타입을 제공학기 위해 CWnd 로 부터 유도된 CFrameWnd, CMDIFramWnd, CMDIChildWnd, CView, CDialog 를 포함하는 많 은 클래스가 있다.

6.3 CDC 와 그 파생 클래스 화면 표시와 인쇄 뿐만 아니라 윈도우 의 클라이언트 영역에 연결된 display context 를 가지고 작업하는 멤버들과 같은 dc 를 가지고 작업하는 멤버함수 제공 Dc 작업에 대한 멤버함수, 그리기 툴 을 통한 작업, type-safe GDI 개체 선 택, 색상과 팔레트를 통한 작업등을 지원 와 EndPaint 호출을 캡슐화하는 CPaintDC 와 윈도우의 클라이언트에 연결되는 display context 를 관리하는 CClientDC 등이 CDC 로부터 유도 M_hDC 와 m_hAttribDC 라는 두가지 dc 를 가지고 있고 이것은 동일한 디 바이스를 참조하는 CDC 객체의 모양 이다. CDC 는 모든 출력 GDI 가 m_hDC 를 호출하도록 하고 대부분의 attributes GDI 는 m_hAttribDC 를 호 출하도록 한다

6.4 SDI 스켈리턴 프로그램 속의 클래스 구조 항목설정 프로젝트명 Sdiclass 응용 프로그램 형식 SDI 데이터베이스지원없음 ActiveX controls 없음 툴바 / 상태 표시줄있음 인쇄와 미리보기있음 기타디폴트 상태로 작성할 프로젝트 리스트

6.4 SDI 스켈리턴 프로그램 속의 클래스 구조 Sdiclass.h 에 있는 CWinApp 의 파생 클래스 가상 함수 InitInstance 의 프로토타입 선언 DECLARE_MESSAGE_MAP( ) 매크로 포 함 어떤 윈도우 메시지가 클래스의 어떤 함수 멤버들에 의해 처리될 것인가를 정의하는 것과 관계 있음 CWinAPP 로부터 파생

6.4 SDI 스켈리턴 프로그램 속의 클래스 구조 MainFrm.h 에 있는 CFrameWnd 의 파생클래스 MainFrm.h 에 있는 CFrameWnd 의 파생 파일 CMainFrame 선언 응용 프로그램 프레임 윈도우에 대한 대부분의 기능 제공 두개의 protected 된 데이터 멤버. 각 각 MFC 클래스인 CStatusBar 와 CTOOLBAR 의 인스턴스. 응용프로그램 윈도우의 밑 부분에 나 타날 상태바를 생성하고 관리.

6.4 SDI 스켈리턴 프로그램 속의 클래스 구조 SdiclassView.h 에 있는 Cview 의 파생클래스 SdiclassView.h 에 있는 CView 클래스의 파생클래스 CSdiclassView 선언. 뷰에 해당하는 도큐먼트 개 체에 대한 포인터를 리턴

6.4 SDI 스켈리턴 프로그램 속의 클래스 구조 SdiclassDoc.h 에 있는 CDocument 의 파생 클래스 이 클래스는 프로그램에서 조작하는 도큐먼트 ( 데이터 ) 의 파일 처리와 전송에 사용 CDocument 로 부터 파생

6.5 ClassWizard 의 개요 데이터 멤버, 멤버 함 수의 추가나 새로운 기저 클래스 선언, 기 존 클래스의 파생클래 스 선언등.