14장 프로젝트 진행

이재홍 http://www.pyrasis.com 2007.10.27 ~ 2008.04.20

목차

들어가기

프로젝트를 만들었으니 이제 실제 기능을 구현할 차례입니다. 어떤 프로젝트던지 개발을 하기 전에 설계부터 할 것입니다. 여러 가지 요구사항과 어떤 기능이 필요하다는 것들이 정리되어 있을 것입니다. 이번 예제에서는 프로젝트 설계대로 티켓을 등록하고, 그 티켓에 해당하는 기능을 구현 한 뒤 소스 코드를 저장소에 커밋할 것입니다.

예를 들어 A라는 프로젝트가 있고, 이 프로젝트에 구현해야 할 기능이 20가지라면 구현해야 할 기능별로 티켓을 20개 생성합니다. 그리고 티켓에 해당하는 내용을 개발하고 기능 구현이 끝나면 티켓을 닫습니다. 이렇게 일을 진행하면 Trac의 Roadmap에서 기능 구현이 어느 정도 진행되어 가는지 쉽게 알 수 있습니다. 프로젝트 관리자는 티켓의 처리 상태에 따라서 일정을 조절할 수 있을 것입니다.


그림 14-1 Roadmap 예제

Project A 기능 구현을 누르면 티켓 제출자, 담당자, 티켓 타입, 컴포넌트, 우선 순위, 버전별로 그래프를 볼 수 있습니다.

기능 구현

hello 프로젝트의 핵심 기능인 Hello World를 출력하는 기능을 구현하겠습니다. 이제 hello 프로젝트의 Trac 사이트에 접속하고 전에 만들어 두었던 사용자로 로그인합니다. New Ticket 메뉴를 선택하고 다음과 같은 내용으로 티켓을 생성합니다.

제목과 내용을 입력하고 Assign to에는 담당자의 ID를 입력합니다. Type은 개발 계획, Priority는 중간, Milestone은 Beta, Component는 hello.exe로 지정합니다. Version은 현재 릴리스된 버전이 없으므로 설정하지 않습니다.


그림 14-2 개발 계획 티켓 생성

Preview 버튼은 티켓을 생성하지는 않고 단지 티켓이 올라갔을 때 어떻게 표시되는지 보여줍니다. Create ticket 버튼을 누르면 티켓이 생성됩니다.

View Ticket 메뉴에서 Active Tickets를 선택하면 다음과 같이 생성된 티켓을 확인할 수 있습니다. 이번에 생성한 티켓의 번호는 #1입니다.


그림 14-3 #1 티켓 생성 완료

Roadmap 메뉴에서도 Beta 마일스톤에 티켓이 1개 등록 되어 있다는 것을 확인할 수 있습니다.


그림 14-4 Roadmap

이제 Visual C++에서 hello 프로젝트를 열고 기능을 구현합니다.


그림 14-5 Hello World 출력 기능 구현

수정된 소스 코드를 커밋합니다. 이때 중요한 것은 re #1입니다. 1번 티켓에 현재 커밋 로그 메시지를 답글로 달겠다는 것입니다.


그림 14-6 커밋 로그 메시지 입력 화면

#1 티켓에는 다음과 같이 커밋 로그 메시지가 답글로 달리게 됩니다. (In [3])은 3번 리비전이라는 뜻입니다. [3] 링크를 누르면 3번 리비전에서 어떤 것들이 수정되었는지 살펴 볼 수 있습니다.


그림 14-7 답글로 달린 커밋 로그 메시지

이제 기능 구현이 끝났으니 resolve as에 수정 완료를 선택하고 Submit changes 버튼을 눌러 티켓을 닫습니다.


그림 14-8 티켓 닫기

이제 기능이 구현되었습니다. 빌드 스크립트에서 설정한 대로 20:00에 자동 빌드가 되어 실행파일이 만들어 질 것입니다. CCTray를 이용하여 강제 빌드를 할 수도 있을 것입니다.


그림 14-9 원격 빌드 도구 CCTray

hello.exe 1.0.0.1이 만들어졌습니다.

세부 기능을 하나 하나 구현할 때마다 해당 티켓에 커밋 로그를 답글로 달고, 티켓을 닫는 방식으로 개발을 진행해 나갑니다. 이렇게 하면 닫힌 티켓과 열린 티켓의 수를 보고 프로젝트의 진행 상황을 가늠할 수 있습니다.

버그 보고 및 해결

빌드된 hello.exe를 실행해 보니 버그가 있었습니다. Hello World로 출력되어야 하는데, Helo World로 출력되고 있습니다. 버그를 발견했으니 버그 보고를 합니다.

버그의 내용을 작성합니다. Assign to에는 버그를 수정할 담당자를 입력합니다. Type은 버그, Priority는 중간, Milestone은 Beta, Component는 hello.exe를 지정합니다. 버그를 발견한 버전이 hello.exe 1.0.0.1이므로 1.0.0.1을 선택합니다.


그림 14-10 버그 티켓 생성

#2 티켓이 생성되었습니다.


그림 14-11 티켓 생성 완료

이제 개발자는 이 티켓을 확인하고 버그를 수정합니다.


그림 14-12 버그 수정

수정된 소스 코드를 커밋합니다. 버그가 보고된 티켓은 #2 입니다. 따라서 re #2로 지정하여 커밋 로그를 답글로 달 수 있도록 합니다.


그림 14-13 커밋 로그 메시지 입력 화면

수정 내용이 답글로 달렸습니다.


그림 14-14 답글로 달린 커밋 로그 메시지

버그가 해결되었으니 resolve as에 수정 완료를 선택하여 티켓을 닫습니다.


그림 14-15 티켓 닫기

20:00에 자동 빌드가 될 때까지 기다리거나, CCTray로 강제 빌드합니다.


그림 14-16 원격 빌드 도구 CCTray

이제 버그가 수정된 hello.exe 1.0.0.2 버전이 만들어졌습니다.

이런 방식으로 버그가 발생하면 테스트팀은 버그의 내용을 기록하여 티켓을 생성하고 개발팀은 티켓의 내용을 확인하여 버그를 수정합니다.

Symbol Server의 활용

지금까지 복잡한 설정을 통해서 심볼 파일(PDB)에 Subversion 저장소 정보를 인덱싱 하고, 심볼 서버에 심볼 파일을 보관하였습니다. 이제 이 심볼 서버를 실제로 활용해 볼 차례입니다. 이 심볼 서버는 메모리 덤프를 분석할 때 사용합니다. 일반적인 심볼 파일은 함수 이름만 저장하고 있기 때문에 덤프 파일을 열어도 호출 스택(Call Stack)에 함수 이름만 표시할 뿐 어셈블리 코드를 분석해야 했습니다. 하지만 우리는 심볼 파일에 Subversion 저장소 정보를 기록하였습니다. 그렇기 때문에 덤프 파일을 열면 Subversion 저장소에서 소스 코드를 받아와서 예외가 발생한 지점을 표시해주게 됩니다.

TIP
이 기능을 사용하려면 TortoiseSVN이 아닌 콘솔용 Subversion(svn.exe)이 필요합니다. svn-1.4.5-setup.exe 파일로 설치를 하면 되고, 이 파일은 부록 CD에 포함되어 있습니다.

hello.exe를 다음과 같이 NULL 포인터에 값을 대입하여 일부러 예외를 발생시킵니다. 물론 수정된 내용은 저장소에 커밋하고 CruiseControl.NET으로 빌드해야 합니다.

hello.cpp

// hello.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int *ptr = NULL;

    printf("Hello trac\n");

    *ptr = 1;

    return 0;
}

빌드된 hello.exe를 닥터왓슨(drwtsn32.exe)을 이용하여 덤프 파일을 만듭니다. 실제 상황에서는 개발자가 덤프 파일을 만들일은 없겠죠. 덤프 파일은 http://winqual.microsoft.com을 서비스를 통하여 입수하거나, 테스트팀에서 개발자에게 전달해주는 것이 일반적입니다.

기본 디버거(Default Debugger)로 닥터왓슨을 지정하기 위해 시작 → 실행에서 다음과 같이 입력합니다.

drwtsn32.exe -i

명령을 실행하면 다음과 같은 메시지가 출력됩니다.


그림 14-17 기본 디버거 설치 메시지

그리고 시작 → 실행에서 drwtsn32.exe를 다시 한번 실행합니다.


그림 14-18 닥터왓슨 설정 화면

크래쉬 덤프(P): 부분에서 찾아보기(O)… 버튼을 눌러 덤프 파일이 생기는 경로를 바탕 화면으로 지정합니다.

이제 hello.exe를 실행하면 다음과 같이 오류 보고 창이 나오게 되고 보내지 않음(D) 버튼을 눌러 창을 닫습니다. 바탕 화면에 user.dmp 파일이 생성된 것을 볼 수 있습니다.


그림 14-19 오류 보고 화면

user.dmp 파일을 개발자 PC로 가져옵니다. 덤프 파일을 열기 전에 Visual Studio 2005에서 몇가지 설정을 해주어야 합니다. Visual Studio 2005를 실행하고 Tools → Options… → Debugging으로 이동합니다.


그림 14-20 Visual Studio 2005에서 소스 서버 사용 설정

Enable source server support(소스 서버 지원 사용)와 Print source server diagnostic messages to the Output window(소스 서버 진단 메시지를 출력 창에 표시)를 체크합니다.

Symbols로 이동합니다.


그림 14-21 심볼 서버 주소 설정, 심볼(PDB) 파일이 저장될 경로 설정

Symbol files (.pdb) locations:(기호 파일(.pdb) 위치(L):)에 \192.168.1.100\Symbols를 추가합니다. 그리고 Cache symbols from symbol servers to this directory:(기호 서버에서 이 디렉터리로 기호 캐시(C):)에 C:\mysymbols를 지정합니다.

192.168.1.100 서버의 C:\Symbols 디렉토리를 공유 폴더로 지정했는지 다시 한번 확인합니다.

이제 user.dmp를 더블클릭 하여 Visual Studio 2005로 열면 다음과 같이 나옵니다. 여기서 user.dmp를 선택한뒤 오른쪽 마우스를 누르면 나오는 팝업 메뉴에서 Debug(디버그(G)) → Start new instance(새 인스턴스 시작(S))를 선택합니다.


그림 14-22 덤프 파일 디버깅 시작

Start new instance(새 인스턴스 시작(S))를 선택하면 다음과 같이 Security Warning(보안 경고) 창이 나옵니다. 그리고 http://192.168.1.100/svn/hello/trunk/hello.cpp 리비전 19를 가져오겠다는 내용이 표시됩니다. Run(실행(R))을 눌러 해당 내용을 실행합니다.


그림 14-23 소스 서버 보안 경고

Run(실행(R))을 누르면 다음과 같이 예외를 잡았다는(Catch) 메시지를 보여줍니다.


그림 14-24 Visual Studio 2005의 예외 발견 메시지

우리는 심볼 파일(PDB)에 Subversion 저장소 정보를 인덱싱하였고 심볼 서버에 저장해놓았습니다. Visual Studio 2005는 덤프 파일에 맞는 심볼 파일을 심볼 서버(\192.168.1.100\Symbols)에서 가져온 뒤 C:\mysymbols 디렉토리에 저장합니다. 그리고 심볼 파일에 저장된 Subversion 저장소 정보에 따라 소스를 가져와서 사용자에게 보여주는 것입니다. 이제 hello.cpp의 내용이 나오고, 예외가 발생한 지점인 *ptr = 1; 부분을 화살표로 표시해줍니다.


그림 14-25 예외가 발생한 지점 표시

물론 심볼 파일도 읽어왔기 때문에 호출 스택(Call Stack)에 함수의 이름도 정확하게 표시됩니다. 특히 호출 스택이 길어서 중간에 함수가 많은 경우, 각 함수를 더블클릭하면 해당 함수의 소스 코드를 Subversion 저장소에서 가져와서 표시해줍니다.


그림 14-26 호출 스택(Call Stack)

TIP
Visual Studio 2005에서 덤프 파일을 열었을 때, 덤프 파일에 따라서 호출 스택이 정확하게 표시되지 않을 때가 있습니다. 이런 덤프 파일은 WinDBG에서 열면 호출 스택이 정상적으로 표시됩니다. 또한 Visual Studio 2005에서 열리지 않는 덤프 파일도 있는데, 이런 덤프 파일도 WinDBG에서 열면 됩니다.

Visual Studio 2005를 사용하지 않고 Visual Studio 6.0을 사용하는 분들이 있을 것입니다. 아쉽게도 Visual Studio 6.0에서는 이러한 기능을 활용할 수가 없습니다. 그래서 WinDBG로 심볼 서버를 이용하는 방법을 설명하겠습니다.

WinDBG를 실행하고 File → Symbol File Path …를 선택합니다. 그리고 SRVc:\mysymbols\192.168.1.100\Symbols를 입력합니다.


그림 14-27 심볼 서버 주소 설정

File → Source File Path …를 선택하고 SRV를 입력합니다(이 부분을 SRV로 설정하지 않으면 Subversion 저장소에서 소스 코드를 받아오지 않습니다).


그림 14-28 소스 서버 설정

File → Open Crash Dump …을 선택하여 user.dmp를 엽니다. workspace를 저장하겠냐는 창이 나오면 Yes를 눌러 저장합니다.


그림 14-29 WinDBG 설정 저장

workspace를 저장하면 곧바로 Microsoft Source Server Security Alert 창이 나옵니다. http://192.168.1.100/svn/hello/trunk/hello.cpp 리비전 19를 가져오겠다는 내용이 표시됩니다. 여기서 Yes를 눌러 해당 내용을 실행합니다.


그림 14-30 소스 서버 보안 경고

이제 user.dmp 파일이 열렸습니다. 그리고 WinDBG에는 hello.cpp의 내용이 나오고, 예외가 발생한 지점인 *ptr = 1;을 블록 지정 상태로 표시해줍니다.


그림 14-31 예외가 발생한 지점 표시

물론 WinDBG의 호출 스택 표시창에서도 각 함수를 더블클릭하면 함수에 해당하는 소스 코드를 Subversion 저장소에서 가져와서 표시해줍니다.


그림 14-32 호출 스택(Call Stack)


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.