4장 Subversion과 Symbol 파일 연동

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

목차

들어가기

윈도우 애플리케이션이나 드라이버를 개발하다 보면 EXE, DLL, SYS 파일과 함께 PDB(프로그램 데이터베이스) 파일이 생성됩니다. 이 파일은 심볼 파일이라고도 합니다. 심볼 파일에는 해당 EXE, DLL, SYS 파일에 담겨있는 함수, 변수의 이름 소스 정보, 디버깅 정보 등이 들어 있습니다. 그래서 애플리케이션이나 드라이버가 실행 중 문제가 생겨 메모리 덤프 파일을 남겼을 경우 PDB 파일을 통해 어느 함수에서 문제가 발생했는지 알 수가 있습니다. 하지만 PDB 파일과 문제가 발생했던 EXE, DLL, SYS 파일이 정확히 일치해야 디버거에서 로드가 되는데, 대부분 개발자들은 이 PDB 파일을 보관하지 않아 디버깅에 어려움을 겪고 있습니다. 그래서 Microsoft에서는 심볼 관리를 쉽게 하기 위해 Symbol Server를 구축할 수 있도록 Debugging Tools for Windows를 배포하고 있습니다.

지금까지 PDB 파일을 이용하여 디버깅을 할 때 어느 함수에서 문제가 발생했다는 것만 알 수 있고, 함수 내에서 정확한 위치가 나오지 않아 소스와 비교해가면서 분석해야 하는 어려움이 있었습니다. 이제는 Subversion과 연동하여 PDB 파일에 Subversion 저장소 정보를 인덱싱 한 뒤, 디버깅시 자동으로 저장소에서 소스 파일을 받아와 문제가 발생한 위치를 표시해 줄 수 있습니다.

이 장에서는 Debugging Tools for Windows과 Subversion을 연동하여, PDB 파일에 Subversion 저장소 정보를 인덱싱 한 뒤, Symbol Server에 저장하는 방법을 설명하겠습니다.

Debugging Tools for Windows와 ActivePerl을 설치할 것인데, Debugging Tools for Windows는 Subversion 인덱싱 스크립트인 svn.pm 파일을 사용하기 위해 설치합니다. ActivePerl은 svn.pm 파일이 Perl로 작성되어 있기 때문에 svn.pm 파일을 실행하기 위해 설치할 것입니다.

Debugging Tools for Windows 설치

Debugging Tools for Windows는 커널 모드 드라이버 개발자에게 필수적인 디버거인 WinDBG를 사용하기 위해 설치하는 것이 일반적입니다. 하지만 WinDBG이외에도 디버깅을 편리하게 해주는 다양한 도구들이 포함되어 있습니다. 그중에서 이 장에서는 Subversion 인덱싱 스크립트인 svn.pm과 심볼 서버 형태로 PDB 파일을 저장해주는 symstore.exe를 사용할 것입니다.

Debuggin Tools for Windows는 다음 URL에서 받을 수 있습니다. 이 책에서는 dbg_x86_6.8.4.0.msi를 사용하도록 하겠습니다.

  • 다운로드 주소 : http://www.microsoft.com/whdc/devtools/debugging/default.mspx
TIP
낮은 버전의 Debugging Tools for Windows에서는 svn.pm 파일이 없을 수도 있습니다. 따라서 최신 버전을 사용해야 합니다. svn.pm 파일은 Subversion 저장소와 연동하여 심볼 인덱싱을 처리하는 Perl 모듈입니다.
  1. 설치 파일을 실행시킨 후 Next를 눌러 다음으로 넘어갑니다.


    그림 4-1 Debugging Tools for Windows 설치 마법사

  2. 라이센스 동의 화면이 나타나면 I agree를 선택하고 Next를 누릅니다.


    그림 4-2 라이센스 동의 화면

  3. [그림 4-3]의 대화상자에서 User Information은 컴퓨터 이름과 단체 이름을 입력하는 화면입니다. 별다른 설정사항이 없으므로 Next를 눌러 넘어갑니다.


    그림 4-3 컴퓨터 이름과 단체 설정 화면

  4. Custom을 선택하고 Next를 누릅니다.


    그림 4-4 설치 형태 지정 화면

  5. Debugging Tools for Windows를 설치할 경로를 지정합니다. 기본 설정대로 설치합니다.


    그림 4-5 Debugging Tools for Windows 설치 경로 지정 화면

  6. Subversion과 연동하기 위해서는 Source Server가 선택되어 있어야 합니다. 이 Source Server에 svn.pm 파일이 포함되어 있기 때문엡니다. 설치하도록 설정되어 있는지 확인하고 Next를 누릅니다.


    그림 4-6 설치 구성 요소 선택 화면

  7. Debugging Tools for Windows 설치 준비 화면입니다. 설치 준비가 완료되었으면 Next를 눌러 설치를 시작합니다.


    그림 4-7 Debugging Tools for Windows 설치 준비 화면

  8. Debugging Tools for Windows 파일 복사 화면이 나타납니다.


    그림 4-8 Debugging Tools for Windows 파일 복사 화면

  9. 설치가 성공적으로 완료되었음을 알리는 대화상자가 나타나면 Finish를 눌러 설치를 종료합니다.


    그림 4-9 Debugging Tools for Windows 설치 완료

ActivePerl 설치

PDB 파일에 Subversion 저장소 정보를 인덱싱하는 svn.pm 파일을 실행하려면 ActivePerl이 필요합니다. 이 책에서는 ActivePerl-5.10.0.1002-MSWin32-x86-283697.msi를 사용하겠습니다. ActivePerl 설치 파일은 다음 URL에서 받을 수 있습니다.

  1. ActivePerl 설치 파일을 다운로드하여 실행시킵니다. Next를 눌러 넘어갑니다.


    그림 4-10 ActivePerl 설치 마법사

  2. I accept the terms in the License Agreement를 선택하고 Next를 누릅니다.


    그림 4-11 라이센스 동의 화면

  3. ActivePerl이 설치 될 경로를 지정하고, 설치 요소를 선택하는 화면입니다. 기본 설정대로 설치합니다.


    그림 4-12 ActivePerl 설치 경로 지정 및 설치 구성 요소 선택 화면

  4. 환경 변수에 ActivePerl이 설치된 경로를 추가할 것인지 지정할 수 있고, pl 파일을 ActivePerl에 연결할 것인지 지정할 수 있습니다. 환경 변수에 경로를 추가하는 것은 꼭 필요합니다.


    그림 4-13 환경 변수 자동 등록 설정 화면

  5. Install을 눌러 설치를 시작합니다.


    그림 4-14 ActivePerl 설치 준비

  6. ActivePerl 파일 복사 화면이 나타납니다.


    그림 4-15 ActivePerl 파일 복사 화면

  7. 복사가 끝나면 Finish를 눌러 설치를 완료합니다.


    그림 4-16 ActivePerl 설치 완료

Subversion Symbol Indexing 사용

Subversion 저장소 정보를 인덱싱 할 예제 프로젝트부터 만들도록 하겠습니다. 앞 장에서 Subversion 사용법을 익혔다면 쉽게 할 수 있습니다. 그리고 이 책에서는 Visual C++ 2005를 사용하겠습니다.

exampe 저장소 만들기

Subversion 저장소 부모 디렉터리(C:\Repos) 아래에 example이라는 저장소를 만듭니다. 시작 → 모든 프로그램 → 보조프로그램 → 명령 프롬프트를 실행하고 다음와 같이 입력합니다.

C:\Repos>svnadmin create example

example 저장소의 svnserve.conf, passwd, authz 파일은 아래와 같이 설정합니다.

C:\Repos\example\conf\svnserve.conf

anon-access = none
auth-access = write

password-db = passwd

authz-db = authz

C:\Repos\example\conf\passwd

[users]
sampleuser = abcd1234

C:\Repos\example\conf\authz

[/]
sampleuser = rw

trunk, branchses, tags 디렉터리 만들기

svn 명령이나 TortoiseSVN을 사용하여 example 저장소 안에 trunk, branches, tags 기본 디렉터리를 만듭니다.

svn mkdir svn://127.0.0.1/example/trunk
svn mkdir svn://127.0.0.1/example/branches
svn mkdir svn://127.0.0.1/example/tags
TIP
"svn: 호스트 '127.0.0.1'에 접속할 수 없습니다.: 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다."라는 오류 메시지가 나올 때
1. svnserve.exe가 정상적으로 실행되고 있는가?(일반 모드) 아니라면 새로운 명령 프롬프트를 열고 "svnserve.exe -d -r C:\Repos"를 실행합니다.
2. 서비스 모드일 경우 서비스를 시작했는가? 아니라면 명령 프롬프트에서 "net start svnserve"를 실행하거나 관리 도구의 서비스에서 Subversion svnserve 서비스를 시작합니다.

"svn: 인증 실패"라는 에러 메시지가 나올 때
1. C:\Repos\sample\conf 디렉터리 아래에 svnserve.conf 파일을 열고 아래와 같이 anon-access, auth-access, password-db가 정상적으로 설정되어 있는지 확인합니다.
anon-access = none
auth-access = write

password-db = passwd
2. C:\Repos\sample\conf 디렉터리 아래에 svnserve.conf 파일에서 아래와 같이 authz-db를 'authz-db = authz'로 설정했다면 C:\Repos\sample\conf 디렉터리 아래에 authz 파일을 다음과 같이 설정되어 있는지 확인합니다.
[/]
sampleuser = rw
3. C:\Repos\sample\conf 디렉터리 아래에 passwd 파일을 열고 아래와 같이 사용자 설정이 정상적으로 되어 있는지 확인합니다.
[users]
sampleuser = abcd1234
4. C:\Repos\sample\conf 디렉터리의 authz 파일에서 쓰기 권한을 막아놓지는 않았는지 확인합니다.

example 프로젝트 체크아웃하기

이 example 프로젝트를 C:\Work\example에 체크아웃 합니다. 바탕 화면 같이 경로에 한글 디렉터리가 들어있으면 Subversion 인덱싱 스크립트가 정상적으로 동작하지 않습니다.


그림 4-17 example 프로젝트를 C:\Work\example에 체크아웃한 화면

프로젝트를 저장소에 추가하기

Visual C++ 2005로 example이라는 이름의 Win32 Console Application 프로젝트를 만들고 저장소에 추가합니다.

  1. File → New → Project…메뉴를 실행합니다. Project types에서 Visual C++ → Win32의 Win32 Console Application을 선택합니다. 그리고 Name에는 example Location에는 C:\Work를 지정합니다. Create directory for solution에 꼭 체크합니다. Solution Name도 마찬가지로 example로 지정합니다. Create directory for solution을 체크했다면 Solution Name은 Name과 똑같이 자동으로 지정될 것입니다.


    그림 4-18 Visual Studio 2005의 새 프로젝트 생성 화면

  2. Next를 눌러 넘어갑니다.


    그림 4-19 Win32 Application Wizard

  3. Application type은 기본 설정대로 Console application으로 하고 Finish를 눌러 프로젝트를 생성합니다.


    그림 4-20 프로젝트 형태 설정 화면

  4. 프로젝트가 정상적으로 생성되었습니다. 이제 Visual Studio 2005를 종료합니다.


    그림 4-21 example 프로젝트가 정상적으로 생성된 화면

  5. 이제 탐색기에서 C:\Work\example로 이동합니다. 그리고 C:\Work\example 아래의 example 디렉터리와 example.sln 파일을 선택한 뒤 TortoiseSVN → 추가(A)… 메뉴를 실행합니다. example.ncb, example.suo 두 파일은 추가하지 않습니다.


    그림 4-22 Visual Studio 2005로 생성된 프로젝트를 Subversion 저장소에 추가하는 화면

  6. 프로젝트를 구성하고 있는 파일을 추가합니다. 여기서 불필요한 파일인 example.vcproj.EXPERIENCE.xp.user 파일의 체크를 해제하고 확인을 누릅니다.


    그림 4-23 추가할 파일을 선택하는 화면

  7. 파일을 추가하고 커밋했다면 아래와 같은 모습이 되어 있을 것입니다.


    그림 4-24 파일을 추가하고 커밋이 완료된 화면

TIP
Visual C++ 2005로 프로젝트를 생성 할 경우 .suo, .ncb, .user 파일이 생기는데 이 파일들은 임시 파일들이므로 저장소에는 추가하지 않습니다. 이 파일들은 지워져도 Visual C++ 2005를 다시 실행하면 자동으로 생성됩니다.

svnindex.cmd

Subversion 인덱싱 스크립트는 C:\Program Files\Debugging Tools for Windows\sdk\srcsrv 아래에 들어있는 svn.pm 파일입니다. 이 파일을 그대로 사용할 수는 없고 조금 수정을 해주어야 합니다. 우리는 대부분 한글 윈도우를 사용하고 있고, 여기에 Subversion을 설치하고 Subversion을 실행하면 한글 메시지가 표시됩니다. 그런데 svn.pm 파일은 Subversion의 한글 메시지를 처리할 수 없기 때문에 이 부분을 수정해 주는 것입니다.

TIP
낮은 버전의 Debugging Tools for Windows에는 svn.pm 파일이 없습니다.

svn.pm 파일의 3부분을 수정해 줍니다. 별달리 수정할 부분은 없고 Path와 Revision 뒤에 한글로 “경로”와 “리비전”을 추가해주는 것입니다.

Path: → Path|경로:
Revision: → Revision|리비전:

161줄을 다음과 같이 수정합니다.

수정 전

if ( $curline =~ m/^Path:[\s\t]*(.*)$/i ) {

수정 후

if ( $curline =~ m/^Path|경로:[\s\t]*(.*)$/i ) {

191줄을 다음과 같이 수정합니다.

수정 전

if ( $curline =~ m/^Revision:[\s\t]*(\d*)$/i ) {

수정 후

if ( $curline =~ m/^Revision|리비전:[\s\t]*(\d*)$/i ) {

199줄을 다음과 같이 수정합니다.

수정 전

if ( $curline =~ m/^Path:[\s\t]*(.*)$/i ) {

수정 후

if ( $curline =~ m/^Path|경로:[\s\t]*(.*)$/i ) {

Debugging Tools for Windows 버전이 올라감에 따라 줄 번호는 약간씩 달라질 수 있습니다. 하지만, 경로와 리비전을 추가해 주는 것은 똑같습니다.

시작 → 제어판 → 시스템 → 고급 → 환경 변수(N)으로 이동합니다. 시스템 변수(S)에서 Path를 선택하고 편집(I) 버튼을 누릅니다. 그리고 C:\Program Files\Debugging Tools for Windows\sdk\srcsrv를 추가해줍니다. C:\WINDOWS\system32\WindowsPowerShell\v1.0;C:\Program Files\Debugging Tools for Windows\sdk\srcsrv 처럼 다른 경로가 앞에 있다면 경로와 경로 사이를 ;(세미콜론)으로 구분해주어야 합니다.


그림 4-25 환경 변수에 시스템 변수의 Path에 경로 추가

이제 svn.pm 파일을 사용할 수 있습니다. 이 svn.pm 파일을 직접 사용하는 것은 아니고 svnindex.cmd를 통하여 사용하게 됩니다.

Subversion 저장소 정보를 기록할 PDB 파일은 릴리스 버전으로 생성된 것(소스 정보가 제거된 것)을 사용해야 합니다. 일반적으로 소프트웨어 제품은 릴리스 모드로 빌드된 것이 배포되기 때문입니다. 즉 Subversion 저장소 정보가 기록된 PDB 파일은 제품이 배포되고난 다음 발생한 덤프 파일을 분석할 때 사용합니다.

Subversion 저장소 정보를 인덱싱하기

  • 1. 예외를 유발하는 소스 코드 작성
    example 프로젝트의 _tmain 함수를 아래 코드와 같이 작성하고 커밋합니다. NULL 포인터에 값을 대입하는 상황을 만드는 것입니다.

example.cpp

#include <stdafx.h>

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

    *hello = 10;

    return 0;
}
  • 2. example 프로젝트를 릴리스(Release) 모드로 빌드합니다.

  • 3. 명령 프롬프트를 실행하고 C:\Work\example로 이동한 뒤 다음 명령을 실행합니다. /source에는 현재 작업 디렉터리의 최상위 경로를 지정합니다. 절대 경로만 설정할 수 있습니다. /symbols에는 릴리즈 모드로 빌드된 PDB 파일이 있는 경로를 지정합니다. 절대, 상대 경로 모두 가능합니다.

C:\Work\example>svnindex.cmd /debug /source=C:\Work\example /symbols=C:\Work\example\release


그림 4-26 svnindex.cmd를 실행하여 Subversion 저장소 정보를 PDB 파일에 인덱싱 하는 화면

위와 같은 화면이 나왔다면 Subversion 저장소 정보를 PDB 파일에 인덱싱하는 것을 성공한 것입니다.

Subversion 저장소 정보 인덱싱에 실패한 경우

만일 다음 화면과 같이 맨 마지막에 “… zero source files found …“이라고 출력된다면 Subversion 저장소 정보를 PDB 파일에 인덱싱 하는 것을 실패한 것입니다.


그림 4-27 svnindex.cmd의 실행이 실패한 화면

이런 경우 다음과 같은 내용을 점검해 봅니다.

  1. C:\Program Files\Debugging Tools for Windows\sdk\srcsrv 디렉터리 아래 svn.pm 파일에서 다음 부분이 정상적으로 수정되었는지 확인합니다. 특히 |(파이프)대신 :(콜론)을 입력하지는 않았는지 확인합니다.
    • Path: → Path|경로:
      Revision: → Revision|리비전:
  2. C:\Work\example 디렉터리가 정상적으로 체크아웃 되었는지 확인합니다. 체크아웃 된 상태가 아닌 익스포트 된 상태에서는 svnindex.cmd를 사용할 수 없습니다.

  3. C:\Work\example 디렉터리를 체크아웃했지만 프로젝트의 파일들은 저장소에 추가되지 않은 상태인지 확인합니다. 프로젝트의 파일들은 꼭 Subversion 저장소에서 관리되고 있어야하고 그 내용이 체크아웃된 상태가 되어야 합니다.

  4. VS2005를 열고 example 프로젝트 속성(Properties) → C/C++ → General에서 Debug Information Format 부분이 Program Database (/Zi)로 설정되어 있는지 확인합니다. 이 부분이 Disabled로 되어 있으면 zero source files found 오류가 발생합니다.


그림 4-28 example 프로젝트의 Debug Information Format 설정을 확인하는 화면

VS6.0에서도 프로젝트 설정(Project Settings)에서 C/C++ → General의 Debug info: 부분이 Program Database로 설정되어 있는지 확인합니다. 이 부분이 None으로 설정되어 있으면 zero source files found 에러가 발생합니다.


그림 4-29 Visual Studio 6.0에서 Debug info 설정을 확인하는 화면

srctool

Subversion 저장소 정보가 정확히 들어가 있는지 확인하는 도구가 srctool.exe입니다. 각 소스 파일에 대해 저장소 정보와 리비전 정보를 표시해 줍니다. 디버거에서는 이 정보를 이용하여 저장소에서 알맞은 리비전의 소스 파일을 가져오게 되는 것입니다. 심볼 인덱싱은 여기까지 하고 실제 사용법은 통합 개발 환경의 실제 활용편에서 설명하겠습니다.

C:\Work\example\release>srctool example.pdb


그림 4-30 srctool을 실행하여 PDB 파일에 기록된 저장소 정보를 확인

위와 같이 각 파일에 대한 저장소 정보를 확인 할 수 있습니다.


저작권 안내

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