출처 : http://xyz2.net/bbs/zboard.php?id=lecture&no=11

 

디버깅시 실행파일 버전에 맞는 소스파일을 자동으로 SVN에서 받아오는 법 (Microsoft Source Server 사용법)
2008-03-27. 마술감자 명국진 (http://magicpotato.com, http://xyz2.net)

원문URL : http://xyz2.net/bbs/zboard.php?id=lecture&no=11

목차

0. 문서 개요
1. 소스서버 소개
2. 소스서버를 사용하는 전체 프로세스 요약
3. 소스서버 구해서 설치하고 세팅하기
4. 소스서버 실제 사용
5. 참고자료
6. 초간단 요약



0. 문서 개요

요즘 대부분의 개발팀은 소스코드 버전 관리 시스템을 사용하고 있다.

어떤 제품을 배포하고 개발하던 소스코드는 계속 버전업을 하게 된다.
그래서 기존에 배포한 제품에서 오류가 났을 때 MiniDump()같은 기능으로 만들어낸 dmp로
디버깅을 하려고 하면 기존 바이너리와 현재의 소스코드 버전이 일치하지 않아서 디버깅에 어려움을 겪는다.
(예:exe는 1월1일 빌드, 현재 소스코드는 3월1일의 버전인 경우)

마소의 소스코드는 이 문제를 해결해 주는 유틸리티인데, 국내에
소스서버를 처음 접하는 사람을 위한 문서가 없어서 작성하게 되었다.

이 문서에서는 소스서버를 소개하고 설치해서 사용하는것까지를 설명한다.

원서를 손쉽게 읽을 수 있는분은 MS Debugging Tools를 받아서 sdk/srccvr/srcsrv.doc 를 읽으면 된다.



* MiniDump()
   마소가 제공하는 Platform SDK: Debugging and Error Handling 의 함수로 dbghelp.dll이 제공하는 기능이다.
   보통 컴파일러를 켠 상태에서 에러가 나면 콜스택과 현재 프로그램의 상태를 디버깅할 수 있는데
   일반 유저에게 배포한 프로그램에서 에러가 나면 어떻게 할 수 없기 때문에 개발자가 재현할 수 있도록
   .dmp 파일을 남겨서 http등으로 에러 업로드를 받아서 VC++에서 디버깅을 할 수 있게 해주는 함수이다.
   (.dmp를 이용하기 위해서는 exe파일와 pdb파일과 추가적으로 소스파일들이 필요하다)

* 소스코드 버전 관리 시스템
   주로 팀 작업시 소스코드를 관리하는 중앙 서버를 따로 두고, 작업한 내용을 업로드 하고,
   남이 작업해 올려놓은 코드를 다시 다운로드(업데이트받기)하는것을 하게 해준다.
   소스파일이 변경될 때마다 버전이 증가되는데 이것을 리비전 이라고도 부른다.

   관련된 툴로는 Subversion, SourceSafe, StarTeam, Perforce, Alienbrain등이 있다.



1. 소스서버 소개

'소스서버'라는 이름을 들으면 웹서버처럼 어떤 서버처럼 느껴지는데 전혀 그렇지 않다.
개인적으로 이름을 잘못지었다고 생각된다. 소스서버는 클라이언트에서만 작동하는 단순 유틸리티이다.

소스서버는 크게 2가지 유틸리티로 구성된다.
  1) 빌드되어있는 pdb파일에 관련 소스코드 정보를 삽입하는 유틸리티
     (삽입되는 정보 : 어떤 소스파일을 버전 관리 서버로부터 어떻게 받을 수 있는지)

  2) pdb의 소스코드 버전정보를 얻어서 소스코드를 받는 기능




2. 소스서버를 사용하는 전체 프로세스 요약

설치
1) 필요한 유틸리티 및 환경변수 설정 (DebuggingTools, SVN, ActivePerl) 및 (PATH)

사용
2) 컴파일러를 사용해서 exe와 pdb 생성
3) (매 릴리즈마다) SourceIndex 툴을 사용해서 생성되어있는 pdb에 svn의 소스파일과 버전 정보를 삽입 (SVN저장소는 건드리지 않는다)
4.1) (디버깅시)pdb에 있는 리비전 정보를 이용해 VC8의 SourceServer통합기능을 사용해 소스를 받아 콜스택을 본다.
4.2) (디버깅시)pdb에 있는 리비전 정보를 이용해 srctool.exe를 사용해서 해당 버전과 일치하는 소스를 받아 수동작업을 한다.

*) 주의사항
    ssindex.cmd를 사용해서 pdb에 소스파일/리비전 정보를 넣을 때 유틸리티는 exe와 소스파일이 일치하는지 확인하지 않는다.
    따라서 ssindex(SourceIndexing)는 한번만 해야 하며, ssindex를 2번째 실행 할 때 이미 인덱싱된 pdb에 영향이 가지 않도록
    완전 다른 폴더에 따로 보관해 둬야 한다.




3. 소스서버 구해서 설치하고 세팅하기


1) 소스서버

    소스서버는 그 자체로 제품이 아니라 Microsoft Debugging Tools에 포함되어있는 서브툴이다.
    http://www.microsoft.com/whdc/devtools/debugging/default.mspx 에서 적당한것을 다운받아서 설치하면
    C:\Program Files\Debugging Tools for Windows\sdk\srcsrv 같은 위치에 소스서버 유틸리티들을 찾을 수 있다.


2) Perl (ActivePerl)

    소스서버는 폴더 탐색이나 소스컨트롤 사용등 기타 작업을 쉽게 하기위해 perl 스크립트를 사용한다.
    여기서는 무난한 ActivePerl을 사용하겠다. (http://www.activestate.com/Products/activeperl/)
    입력하기 귀찮으면 아래 주소에서 받아도 된다.

      http://xyz2.net/ea/ActivePerl-5.10.0.1002-MSWin32-x86-283697.zip
      http://xyz2.net/ea/ActivePerl-5.10.0.1002-MSWin32-x64-283697.zip


3) SVN (버전 관리 시스템)

    SVN에 대해 자세히 설명하는것은 이 문서의 범위를 벗어나므로 링크만 기록한다.

      http://subversion.tigris.org/project_packages.html
      http://xyz2.net/ea/svn-1.4.5-setup.exe




4. 소스서버 실제 사용 (예제)


1) 세팅

   SrcSvr과 Perl, svn을 어디에서나 실행할 수 있도록 환경변수 PATH를 수정해 줘야 한다.
   또한 SrcSvr이 어떤 svn에 접근해야 하는지를 알려줘야 한다.

   * PATH = C:\Perl\bin;C:\Program Files\Subversion\bin;C:\Program Files\Debugging Tools for Windows\sdk\srcsrv

   * 소스서버정보 세팅 
     대상파일 : C:\Program Files\Debugging Tools for Windows\sdk\srcsrv\srcsrv.ini 내의 MYSERVER 값 수정
     수정 예  : MYSERVER=svn://MyteamSource

   SVN을 기반으로 소스서버 유틸리티를 사용하면 C:\Program Files\Debugging Tools for Windows\sdk\srcsrv\svn.pm 을 실행하는데
   한글과 관련된 문제를 해결하기 위해 2줄을 수정해 준다. (경로와 리비전을 추가)

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

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


2) 샘플 프로젝트 생성후 빌드, SVN에 업로드 (2번 작업은 3번 작업과 병행하게 된다)

  일부러 오류를 일으키는 간단한 프로젝트를 생성해서 SVN에 소스파일을 업로드 해 놓는다.
  그리고 빌드를 해서 exe와 pdb를 만들어 놓는다.

  SVN의 저장소 위치나 이름은 어떻게 지어도 상관없다.
  이 예제에서는 서로 다른 버전의 소스파일로 컴파일된 바이너리 2 쌍을 백업해 놓는다.

    솔루션 및 소스파일 위치 : D:\...\SrcSvrTestByMagicPotato
    exe 및 pdb 파일 위치 : D:\...\SrcSvrTestByMagicPotato\Debug

    


3) ssindex를 실행해서 pdb에 SVN 정보 삽입

    테스트 프로젝트의 루트에서 ssindex를 실행하면 서브 폴더를 모두 돌면서 .pdb를 갱신시켜준다.
    이때 SVN에 어떤 파일을 올리거나, 기존에 올라간 파일을 전혀 건드리지 않는다.

    아래 예시에서는 ssindex를 한번만 사용했지만, 실제로는 2번 사용한다.

    3.1) 버전1에 대한 빌드를 만들고 소스를 모두 올려놓고 ssindex를 사용한 다음 exe와 pdb를 다른곳에 백업.
    3.2) 로컬 소스에 수정을 가하고 버전2에 대한 빌드를 만들고 소스를 모두 올려놓고 ssindex를 사용한 다음 exe와 pdb를 다른곳에 백업.


    D:\...\SrcSvrTestByMagicPotato)ssindex -system=svn
    --------------------------------------------------------------------------------
    ssindex.cmd [STATUS] : Server ini file: C:\Program Files\Debugging Tools for Windows\sdk\srcsrv\srcsrv.ini
    ssindex.cmd [STATUS] : Source root    : D:\...\SrcSvrTestByMagicPotato
    ssindex.cmd [STATUS] : Symbols root   : D:\...\SrcSvrTestByMagicPotato
    ssindex.cmd [STATUS] : Control system : SVN
    ssindex.cmd [STATUS] : SVN Executable : svn.exe
    ssindex.cmd [STATUS] : SVN Revision   : N/A
    ssindex.cmd [STATUS] : SVN Username   : N/A
    ssindex.cmd [STATUS] : SVN Password   : N/A
    --------------------------------------------------------------------------------
    ssindex.cmd [STATUS] : Running... this will take some time...
    ssindex.cmd [STATUS] : Processing svn.exe properties output ...




4) pdb에 리비전 정보가 제대로 들어갔는지 수동으로 확인


    D:\...\SrcSvrTestBackup)srctool v1\srcsvrtestbymagicpotato.pdb
    [d:\...\srcsvrtestbymagicpotato\stdafx.cpp] cmd: cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/stdafx.cpp@7229" --non-interactive  "D:\...\SrcSvrTestBackup\...\SrcSvrTestByMagicPotato\stdafx.cpp\7229\stdafx.cpp"
    [d:\...\srcsvrtestbymagicpotato\stdafx.h] cmd: cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/stdafx.h@7229" --non-interactive  "D:\...\SrcSvrTestBackup\...\SrcSvrTestByMagicPotato\stdafx.h\7229\stdafx.h"
    [d:\...\srcsvrtestbymagicpotato\srcsvrtestbymagicpotato.cpp] cmd: cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/SrcSvrTestByMagicPotato.cpp@7230" --non-interactive  "D:\...\SrcSvrTestBackup\...\SrcSvrTestByMagicPotato\SrcSvrTestByMagicPotato.cpp\7230\srcsvrtestbymagicpotato.cpp"

    v1\srcsvrtestbymagicpotato.pdb: 3 source files are indexed - 160 are not

    D:\...\SrcSvrTestBackup)srctool v2\srcsvrtestbymagicpotato.pdb
    [d:\...\srcsvrtestbymagicpotato\stdafx.cpp] cmd: cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/stdafx.cpp@7229" --non-interactive  "D:\...\SrcSvrTestBackup\...\SrcSvrTestByMagicPotato\stdafx.cpp\7229\stdafx.cpp"
    [d:\...\srcsvrtestbymagicpotato\stdafx.h] cmd: cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/stdafx.h@7229" --non-interactive  "D:\...\SrcSvrTestBackup\...\SrcSvrTestByMagicPotato\stdafx.h\7229\stdafx.h"
    [d:\...\srcsvrtestbymagicpotato\srcsvrtestbymagicpotato.cpp] cmd: cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/SrcSvrTestByMagicPotato.cpp@7233" --non-interactive  "D:\...\SrcSvrTestBackup\...\SrcSvrTestByMagicPotato\SrcSvrTestByMagicPotato.cpp\7233\srcsvrtestbymagicpotato.cpp"

    v2\srcsvrtestbymagicpotato.pdb: 3 source files are indexed - 160 are not




5) VC8(VS2005)에서 자동으로 소스를 받아서 보여주게 하기 위한 세팅
    컴파일러 없이 EXE만 실행해서 오류를 낼 것인데, 오류가 나면 디버거를 띄울것이다.
    이때 VC8이 소스서버 유틸리티를 사용해서 소스를 자동으로 받게 하려면 세팅이 필요하다.

    [Tools] - [Options] - [Debugging] - [Enable source server support] 의 체크를 켜준다.

    


6) 2쌍의 exe를 실행해서 오류가 나면 디버거를 실행시켜서 소스를 제대로 받는지 확인해 본다.
    (pdb와 연결된 소스코드는 SVN으로부터 받으며, 저장위치는 임시폴더이다)

   VC8에 소스서버 사용 옵션을 켜 놓으면 다음과 같이 소스를 받을건데 실행하냐고 물어본다.

     cmd /c svn.exe cat "svn://.../SrcSvrTestByMagicPotato/SrcSvrTestByMagicPotato.cpp@7230" --non-interactive  "C:\Documents and Settings\magicpotato\Local Settings\Application Data\SourceServer\...\SrcSvrTestByMagicPotato\SrcSvrTestByMagicPotato.cpp\7230\srcsvrtestbymagicpotato.cpp"

     

   소스를 받겠다고 한 다음 첫번째 버전에 대한 디버깅 화면
     

   소스를 받겠다고 한 다음 두번째 버전에 대한 디버깅 화면
     


5. 참고자료

http://msdn2.microsoft.com/ko-kr/magazine/cc163563(en-us).aspx
C:\Program Files\Debugging Tools for Windows\sdk\srcsrv\srcsrv.doc
http://hyperlightz.tistory.com/entry/SourceServerSetup


6. 초간단 요약

[최초설치-빌드머신만]
1) http://www.microsoft.com/whdc/devtools/debugging/default.mspx (소스서버)
2) http://xyz2.net/ea/ActivePerl-5.10.0.1002-MSWin32-x86-283697.zip (액티브펄)
3) http://xyz2.net/ea/svn-1.4.5-setup.exe (SVN)

[최초세팅-빌드머신만]
1) PATH = C:\Perl\bin;C:\Program Files\Subversion\bin;C:\Program Files\Debugging Tools for Windows\sdk\srcsrv
2) 소스서버정보 세팅 
   대상파일 : C:\Program Files\Debugging Tools for Windows\sdk\srcsrv\srcsrv.ini 내의 MYSERVER 값 수정
   수정 예  : MYSERVER=svn://MyteamSource
4) 한글 관련문제 스크립트 수정
   C:\Program Files\Debugging Tools for Windows\sdk\srcsrv\svn.pm
      if ( $curline =~ m/^Path:[\s\t]*(.*)$/i ) { 를
      if ( $curline =~ m/^Path|경로:[\s\t]*(.*)$/i ) { 로

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

[최초세팅-개발자들 모두]
1) [Tools] - [Options] - [Debugging] - [Enable source server support] 의 체크를 켜준다.

[빌드시마다-빌드머신만]
1) ssindex -system=svn (솔루션 루트에서 실행, 하부에 있는 pdb들에 SVN리비전 정보를 삽입)



퍼가실 때에는 원문의 URL을 반드시 포함해 주시거나, 전문 그대로 퍼가주시기 바랍니다.
끝.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히

댓글을 달아 주세요