Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


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

1 CH5 디버그를 해보자 2007. 8.13

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

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

4 5.1 디버그 IDC_FILENAM E IDC_TEXT IDC_OPEN

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

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

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

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

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

10

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

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

13 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 클래스의 멤버 함수

14 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 개의 멤버함수는 다음과 같이 조합하여 사용 블록형

15 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) 포인터의 계산이 끝난 시점에서 포인터가 지시하는 메모리에 원하는 데이터가 존재 하는지 체크

16 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 로 둘러쌈

17 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

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

19 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

20 CH6 MFC 6.0 과 ClassWizard 2007.8.13

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

22 6.1 MFC 의 계층구조

23 CObject CMenu CDocTemplate CCmdTarget CDocument CDC CWndCWinThreadCPaintDCCClientDC CMDIChildWndCMDIFrameWnd CViewCFrameWnd CDialo CWinApp

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

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

26 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 를 호 출하도록 한다

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

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

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

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

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

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


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

Similar presentations


Ads by Google