메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

비주얼 C++ 애드인 프로그램(1) : 바운즈 체커 外

한빛미디어

|

2005-07-27

|

by HANBIT

14,126


본 한빛 네트워크 기사를 블로그 등에 기재할 경우에는 URL을 포함한 출처를 명기해 주시길 부탁드립니다.
특히 아래 본문 서두에 기재된 저자(역자) 및 원출처는 필히 명기해 주시기 바랍니다.

저자: 서진택
원출처: IT EXPERT, 윈도우 프로그래머를 위한 MFC 구조와 원리(한빛미디어, 2005) 부록 중에서



부록에서는 비주얼 C++에서 많이 사용되는 애드인 프로그램을 살펴본다. 훌륭한 개발자는 프로그래밍 실력과 논리력이 뛰어나야 하는 것은 물론이고 좋은 개발 툴들을 능숙하게 사용할 수 있어야 할 것이다.

애드인 프로그램 소개

필자가 비주얼 C++와 함께 사용하는 애드인(add-in) 프로그램을 소개한다. 애드인은 비주얼 C++의 기능을 확장하기 위한 DLL 프로그램이다.

가장 대중적인 애드인으로 바운즈 체커(Bounds Checker)와 비주얼 어시스트(Visual Assist)가 있다. 바운즈 체커를 이용하면 메모리 릭과 메모리 오버런(memory overrun)과 관련된 대부분의 오류를 자동으로 잡아낼 수 있다. 비주얼 어시스트는 강력한 편집 보조 기능을 제공한다. 멤버 함수를 자동으로 찾아가는 기능이나, 멤버에 대한 문법 강조, 향상된 자동 완성기능은 너무나 훌륭한 기능이다.

아래 그림은 필자의 비주얼 C++ IDE 화면이다(사실 2개의 모니터를 쓰고 있다. 한쪽에는 코드 위주로 정렬된 화면, 다른 한쪽에는 디버깅 등 보조 기능용이다. 하지만 설명을 위해, 한 화면에 모든 애드인이 나타나도록 하였다).


[여기서 잠깐]
현업에서 응용프로그램(게임)을 개발하면서, 툴의 중요성을 실감한다. 훌륭한 프로그래머는 잘 정의된 설계를 작성하고, 문제 발생 시 해결 능력이 뛰어나기도 해야겠지만, 좋은 툴들을 잘 사용할 줄 알아야 할 것 같다. 한 예를 들면, 코드 프로젝트(www.codeproject.com)에서 알게 된, 크래시리포트(CrashReport)라는 툴을 사용함으로써, 프로그램이 죽은 후에도 디버깅이 가능하게 되었다! 디버깅을 언제 하냐고? 프로그램이 죽으면 그 때하면 되는 것이다!





[그림 A-1] 비주얼 C++ 통합환경: 가장 요긴한 툴은 바운즈체커, 인크레디 빌드(IncrediBuild), 퍼포스(Perforce), 비주얼 어시스트다. 독자들의 IDE에 포함된 애드인은 [Tools]->[Customize...]를 선택한 다음, Add-ins... 탭을 선택하면 확인해볼 수 있다(몇 가지 애드인은 www.codeproject.com에서 구할 수 있다).

바운즈 체커

바운즈 체커는 메모리 릭(memory leak), 메모리 오버런(memory overrun)등의 오류를 자동으로 발견하는 요긴한 툴이다. 프로젝트의 선임자가 작성해놓은 코드에서 발생하는 곳을 모르는 메모리 릭 때문에 밤새워본 사람들이라면, 바운즈 체커의 위력을 실감할 수 있을 것이다. 3일간의 밤샘을 바운즈 체커는 단 5분 만에 해결할 수 있다!



[그림 A-2] 바운즈 체커의 툴바 화면: 바운즈 체커는 메모리 릭뿐만 아니라, 다양한 종류의 오류와 오류 가능성을 발견하는 유용한 툴이다.

부록 CD-ROM에 제공되는 8장의 /CDC_step2_CDC 폴더를 열어서 바운즈 체커가 어떻게 동작하는지 확인해보자. CDCSTEP2.DSW 프로젝트를 연다. 그리고 CView.cpp 파일의 OnCreate()를 다음과 같이 수정한다.


LRESULT CView::OnCreate(WPARAM wParam,LPARAM lParam) {
    int* p = new int(); // 동적 메모리 할당

    return 0L;
}//CView::OnCreate


소스를 보면 함수 내부에서 힙에 메모리 할당을 한 뒤, 할당한 메모리를 클리어하지 않고, 함수를 탈출하는 논리 오류가 포함된 것을 확인할 수 있다. 이제 바운즈 체커 툴바의 첫 번째 버튼을 눌러 바운즈 체커를 활성화 시키고, F5를 눌러 디버그 런 한다. 그러면 바운즈 체커가 아래와 같은 오류 윈도우를 표시한다.



[그림 A-3] 바운즈 체커의 메모리 릭 발견: 바운즈 체커는 함수 스코프를 빠져 나가는 순간 메모리 릭이 발생했음을 사용자에게 보고한다.

바운즈 체커가 보고한 대화상자에서 [Debug] 버튼을 누르면 메모리 릭이 발생한 시점으로 이동한다. 또한 바운즈 체커의 결과 창에서 상세한 정보를 얻을 수 있다.



[그림 A-4] 바운즈 체커의 결과 창: 소스에서 4바이트의 메모리 릭이 발생했음을 보고한다.

코드위즈

코드위즈는 유용한 단축키를 제공하고, 코드 생성을 돕는다. 코드위즈를 설치한 후, Ctrl+1을 누르면, 클래스 정의 파일(*.h)과 구현 파일(*.cpp)을 토글하여 연다. 긴 함수의 중간에서 다음 함수의 시작 부분으로 가기 위해 Ctrl+PgDn을 누르면, 다음 함수의 시작 부분으로 이동한다. 멤버 함수를 선언한 다음, 함수의 몸체를 구현 파일에 자동으로 생성하기 위해 Ctrl+6을 누른다.



[그림 A-5] 코드위즈의 애드인 메뉴: 각종 편리한 단축키를 제공한다.

코드위즈의 멤버 함수 생성기능을 알아보자. CView.h의 끝 부분에 다음과 같이 함수 프로토타입을 추가한다.


    ...
    LRESULT OnLButtonDown(WPARAM wParam,LPARAM lParam);
    //}}seojt
    //}}AFX_MESSAGE

    int CodeWizFunction(int iParam, float fParam);

    DECLARE_MESSAGE_MAP()
};//class CView


이제 커서를 CodeWizFunction()이 선언된 행의 아무 곳에나 위치시키고, Ctrl+5를 누른다. 그러면 행이 반전되면서, 멤버 함수에 대한 정보를 코드위즈가 기록해둔다. 다음에 Ctrl+1을 눌러 CView의 구현 파일을 연다. 그러면 CView.cpp 파일이 열린다. 커서를 함수를 생성할 적당한 곳에 위치시키고 Ctrl+6을 누르면 아래와 같이 함수의 몸체가 자동으로 생성된다.


int CView::CodeWizFunction(int iParam,float fParam)
{
//
}


코드위즈의 코드 템플릿 기능 또한 유용하다. 코드를 후에 참조하기 위해, 코드의 전후에 //{{ seojt와 //}} seojt를 삽입하기로 했다고 하자. 그러면 코드위즈의 코드 템플릿을 편집해서 해당 기능을 메뉴에 등록한다. 예로 방금 생성한 함수 몸체의 전후에 주석을 삽입하는 과정을 처리해보자.

먼저 함수의 몸체를 모두 블록으로 선택한다. 그리고 코드위즈의 메뉴를 불러 등록된 기능을 활성화한다(필자의 경우 Ctrl+0,s이다). 그러면 선택한 영역의 앞뒤로 자동으로 코드가 삽입된다. 아래의 코드에서 두 줄의 주석은 자동으로 삽입된 것이다.


//{{ seojt: 2005-01-22 오후 4:47:28
int CView::CodeWizFunction(int iParam,float fParam)
{
    return 0;
}
//}} seojt: 2005-01-22 오후 4:47:28




[그림 A-6] 코드위즈의 코드템플릿 메뉴: 자주 사용하는 코드 템플릿을 등록해 사용하면, 번거로운 타이핑을 대폭 줄일 수 있다.
TAG :
댓글 입력
자료실