원본 서버

원본 서버를 사용하면 클라이언트가 애플리케이션을 빌드하는 데 사용된 원본 파일의 정확한 버전을 검색할 수 있습니다. 모듈의 소스 코드는 수년에 걸쳐 버전 간에 변경될 수 있으므로 해당 모듈의 버전이 빌드될 때 존재했던 소스 코드를 살펴보는 것이 중요합니다.

원본 서버는 소스 제어에서 적절한 파일을 검색합니다. 원본 서버를 사용하려면 애플리케이션이 원본 인덱싱되어 있어야 합니다.

원본 인덱싱

원본 인덱싱 시스템은 실행 파일 및 Perl 스크립트의 컬렉션입니다. Perl 스크립트에는 Perl 5.6 이상이 필요합니다.

일반적으로 이진 파일은 애플리케이션이 빌드된 후 빌드 프로세스 중에 인덱싱됩니다. 원본 서버에 필요한 정보는 PDB 파일에 저장됩니다.

원본 서버는 현재 다음 소스 제어 시스템에서 작동해야 하는 스크립트와 함께 제공합니다.

  • Team Foundation Server
  • Perforce
  • Visual SourceSafe
  • CVS
  • Subversion

다른 소스 제어 시스템에 대한 코드를 인덱싱하는 사용자 지정 스크립트를 만들 수도 있습니다.

다음 표에서는 원본 서버 도구를 나열합니다.

도구 설명
Srcsrv.ini 이 파일은 모든 소스 제어 서버의 마스터 목록입니다. 각 항목에는 MYSERVER=serverinfo 형식을 따릅니다.
Perforce를 사용하는 경우 서버 정보는 서버에 대한 전체 네트워크 경로와 콜론, 사용하는 포트 번호로 구성됩니다. 예를 들어 다음과 같습니다.
MYSERVER=machine.corp.company.com:1666
이 파일은 디버거를 실행하는 컴퓨터에 설치할 수 있습니다. 원본 서버가 시작되면 Srcsrv.ini에서 값을 찾습니다. 이러한 값은 PDB 파일에 포함된 정보를 재정의합니다. 이렇게 하면 사용자가 디버그 타임에 대체 소스 제어 서버를 사용하도록 디버거를 구성할 수 있습니다.
자세한 내용은 원본 서버 도구와 함께 설치된 Srcsrv.ini 예제를 참조하세요.
Ssindex.cmd 이 스크립트는 각 파일의 버전 정보와 함께 소스 제어에 체크 인된 파일 목록을 빌드합니다. 애플리케이션을 빌드할 때 생성된 .pdb 파일에 이 정보의 하위 집합을 저장합니다. 스크립트는 다음 Perl 모듈 중 하나를 사용하여 소스 제어 P4.pm(Perforce) 또는 Vss.pm(Visual Source Safe)과 상호 작용합니다. 자세한 내용은 -? 또는 -?? (자세한 도움말) 옵션을 사용하여 스크립트를 실행하거나 스크립트를 검사합니다.
Srctool.exe 이 유틸리티는 .pdb 파일 내에 인덱싱된 모든 파일을 나열합니다. 각 파일에 대해 파일의 전체 경로, 소스 제어 서버 및 버전 번호를 나열합니다. 이 정보를 사용하여 원본 서버를 사용하지 않고 파일을 검색할 수 있습니다. 자세한 내용은 /? 옵션과 함께 유틸리티를 사용합니다.
Pdbstr.exe 이 유틸리티는 인덱싱 스크립트에서 버전 제어 정보를 대상 .pdb 파일의 "srcsrv" 대체 스트림에 삽입하는 데 사용됩니다. .pdb 파일에서 스트림을 읽을 수도 있습니다. 이 정보를 사용하여 인덱싱 스크립트가 제대로 작동하는지 확인할 수 있습니다. 자세한 내용은 /? 옵션과 함께 유틸리티를 사용합니다.

 

원본 파일 검색

DbgHelp API는 SymGetSourceFile 함수를 통해 원본 서버 기능에 대한 액세스를 제공합니다. 검색할 원본 파일의 이름을 검색하려면 SymEnumSourceFiles 또는 SymGetLineFromAddr64 함수를 호출합니다.

디버거에서 원본 서버 사용

WinDbg, KD, NTSD 또는 CDB와 함께 원본 서버를 사용하려면 최신 버전의 Windows용 디버깅 도구 패키지(버전 6.3 이상)를 설치했는지 확인합니다. 그런 후 다음과 같이 .srcpath 명령에 srv*를 포함합니다.

.srcpath srv*;c:\mysource

이 예제에는 기존 원본 경로도 포함되어 있습니다. 디버거가 원본 서버에서 파일을 검색할 수 없는 경우 지정된 경로를 검색합니다.

원본 서버에서 원본 파일을 검색하는 경우 디버깅 세션이 끝난 후에도 하드 드라이브에 유지됩니다. 원본 파일은 Windows용 디버깅 도구 설치 디렉터리의 src 하위 디렉터리에 로컬로 저장됩니다.

원본 서버 데이터 블록

원본 서버는 PDB 파일 내의 두 데이터 블록을 사용합니다.

  • 소스 파일 목록. 모듈을 빌드하면 모듈을 빌드하는 데 사용되는 원본 파일에 대한 정규화된 경로 목록이 자동으로 만들어집니다.
  • 데이터 블록. 앞에서 설명한 대로 원본을 인덱싱하면 "srcsrv"라는 PDB 파일에 대체 스트림이 추가됩니다. 이 데이터를 삽입하는 스크립트는 사용 중인 특정 빌드 프로세스 및 소스 제어 시스템에 따라 달라집니다.

언어 사양 버전 1에서 데이터 블록은 ini, 변수 및 소스 파일의 세 섹션으로 나뉩니다. 구문은 다음과 같습니다.

SRCSRV: ini ------------------------------------------------ 
VERSION=1
VERCTRL=<source_control_str>
DATETIME=<date_time_str>
SRCSRV: variables ------------------------------------------ 
SRCSRVTRG=%sdtrg% 
SRCSRVCMD=%sdcmd% 
SRCSRVENV=var1=string1\bvar2=string2 
DEPOT=//depot 
SDCMD=sd.exe -p %fnvar%(%var2%) print -o %srcsrvtrg% -q %depot%/%var3%#%var4%
SDTRG=%targ%\%var2%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%) 
WIN_SDKTOOLS= sserver.microsoft.com:4444 
SRCSRV: source files --------------------------------------- 
<path1>*<var2>*<var3>*<var4> 
<path2>*<var2>*<var3>*<var4> 
<path3>*<var2>*<var3>*<var4> 
<path4>*<var2>*<var3>*<var4> 
SRCSRV: end ------------------------------------------------

백분율 기호(%)로 묶인 텍스트를 제외하고 모든 텍스트는 문자 그대로 해석됩니다. 백분율 기호로 묶인 텍스트는 다음 함수 중 하나가 아닌 한, 재귀적으로 확인할 변수 이름으로 처리됩니다.

%fnvar%()

매개 변수 텍스트는 백분율 기호로 묶어야 하며 확장할 변수로 처리해야 합니다.

%fnbksl%()

매개 변수 텍스트의 모든 슬래시(/)를 백슬래시(\)로 바꿔야 합니다.

%fnfile%()

매개 변수 텍스트의 모든 경로 정보를 제거해야 하며 파일 이름만 남습니다.

ini 섹션에는 요구 사항을 설명하는 변수가 포함되어 있습니다. 인덱싱 스크립트는 이 섹션에 임의 개수의 변수를 추가할 수 있습니다. 예제는 다음과 같습니다.

VERSION

언어 사양 버전입니다. 이 변수가 필요합니다.

VERCTL

소스 제어 제품을 설명하는 문자열입니다. 이 변수는 선택 사항입니다.

DATETIME

PDB 파일이 처리된 날짜와 시간을 나타내는 문자열입니다. 이 변수는 선택 사항입니다.

변수 섹션에는 소스 제어에서 파일을 추출하는 방법을 설명하는 변수가 포함되어 있습니다. 일반적으로 사용되는 텍스트를 변수로 정의하여 데이터 블록의 크기를 줄일 수도 있습니다.

SRCSRVTRG

추출된 파일의 대상 경로를 빌드하는 방법을 설명합니다. 필수 변수입니다.

SRCSRVCMD

소스 제어에서 파일을 추출하는 명령을 빌드하는 방법을 설명합니다. 여기에는 실행 파일의 이름과 명령줄 매개 변수가 포함됩니다. 필수 변수입니다.

SRCSRVENV

파일 추출 중에 만들 환경 변수를 나열하는 문자열입니다. 여러 항목을 백스페이스 문자(\b)로 구분합니다. 옵션 변수입니다.

원본 파일 섹션에는 인덱싱된 각 원본 파일에 대한 항목이 포함되어 있습니다. 각 줄의 내용은 VAR1, VAR2, VAR3 및 VAR10까지의 이름을 가진 변수로 해석됩니다. 변수는 별표로 구분됩니다. VAR1은 원본 파일의 정규화된 경로를 PDB 파일의 다른 위치에 나열된 대로 지정해야 합니다. 예를 들면 다음 줄은

c:\proj\src\file.cpp*TOOLS_PRJ*tools/mytool/src/file.cpp*3

다음과 같이 해석됩니다.

VAR1=c:\proj\src\file.cpp
VAR2=TOOLS_PRJ
VAR3=tools/mytool/src/file.cpp
VAR4=3

이 예제에서 VAR4는 버전 번호입니다. 그러나 대부분의 소스 제어 시스템은 지정된 빌드의 원본 상태를 복원할 수 있는 방식으로 파일 레이블 지정을 지원합니다. 따라서 빌드에 레이블을 사용할 수도 있습니다. 샘플 데이터 블록은 다음과 같은 변수를 포함하도록 수정할 수 있습니다.

LABEL=BUILD47

그런 다음, 소스 제어 시스템이 at 기호(@)를 사용하여 레이블을 표시한다고 가정하면 다음과 같이 SRCSRVCMD 변수를 수정할 수 있습니다.

sd.exe -p %fnvar%(%var2%) print -o %srcsrvtrg% -q %depot%/%var3%@%label%

원본 서버 작동 방식

원본 서버 클라이언트는 Symsrv.dll에 구현됩니다. 클라이언트는 PDB 파일에서 직접 정보를 추출하지 않고 Dbghelp.dll에 구현된 것과 같은 기호 처리기를 사용합니다. 기본적으로 소스 제어 시스템에서 적절한 소스 파일을 추출하는 데 사용할 수 있는 명령줄을 만드는 재귀 변수 대체 엔진입니다. 코드는 Symsrv.dll을 직접 호출해서는 안 됩니다. 해당 기능을 애플리케이션에 통합하려면 SymGetSourceFile 함수를 사용합니다.

원본 서버의 첫 번째 버전은 다음과 같이 작동합니다. 이 동작은 이후 릴리스에서 변경될 수 있습니다.

  • 클라이언트는 모든 원본 파일 추출의 기반으로 사용할 대상 경로를 사용하여 SrcSrvInit 함수를 호출합니다. 이 경로는 TARG 변수에 저장됩니다.
  • 클라이언트는 모듈 PDB가 로드될 때 PDB에서 Srcsrv 스트림을 추출하고 SrcSrvLoadModule 함수를 호출하여 데이터 블록을 원본 서버에 전달합니다.
  • Dbghelp가 원본 파일을 검색하면 클라이언트는 SrcSrvGetFile 함수를 호출하여 소스 제어에서 원본 파일을 검색합니다.
  • 원본 서버는 데이터 블록의 원본 파일 항목에서 요청된 파일과 일치하는 항목을 검색합니다. 원본 파일 항목의 콘텐츠로 VAR1에서 VARn까지 채웁니다. 다음으로 VAR1~VARn을 사용하여 SRCSRVTRG 변수를 확장합니다. 파일이 이미 이 위치에 있으면 호출자에게 해당 위치를 반환합니다. 그렇지 않으면 SRCSRVCMD 변수를 확장하여 소스 제어에서 파일을 검색한 후 대상 위치에 복사하는 데 필요한 명령을 빌드합니다. 마지막으로 이 명령을 실행합니다.

소스 제어 공급자 모듈 만들기

원본 서버에는 Perforce(p4.pm) 및 Visual Source Safe(vss.pm)에 대한 공급자 모듈이 포함되어 있습니다. 고유한 공급자 모듈을 만들려면 다음 인터페이스 집합을 구현해야 합니다.

$module::SimpleUsage()

목적: STDOUT에 간단한 모듈 사용 정보를 표시합니다.

매개 변수: 없음

반환 값: 없음

$module::VerboseUsage()

목적: STDOUT에 심층 모듈 사용 정보를 표시합니다.

매개 변수: 없음

반환 값: 없음

$objref = $module::new(@CommandArguments)

목적: 공급자 모듈의 인스턴스를 초기화합니다.

매개 변수: SSIndex.cmd에서 일반 인수로 인식되지 않은 모든 @ARGV 인수입니다.

반환 값: 이후 작업에서 사용할 수 있는 참조.

$objref->GatherFileInformation($SourcePath, $ServerHashReference)

목적: 모듈이 $SourcePath 매개 변수로 지정된 디렉터리에 필요한 원본 인덱싱 정보를 수집할 수 있도록 합니다. 모듈에서는 SSIndex.cmd가 이 항목을 다른 경로에 대해 여러 번 호출할 수 있으므로 각 개체 인스턴스에 대해 한 번만 호출된다고 가정해서는 안 됩니다.

매개 변수: (1) 인덱싱할 원본이 포함된 로컬 디렉터리입니다. (2) 지정된 Srcsrv.ini 파일의 모든 항목을 포함하는 해시에 대한 참조입니다.

반환 값: 없음

($VariableHashReference, $FileEntry) = $objref->GetFileInfo($LocalFile)

목적: 소스 제어 시스템에서 단일 특정 파일을 추출하는 데 필요한 정보를 제공합니다.

매개 변수: 정규화된 파일 이름

반환 값: (1) 반환된 $FileEntry를 해석하는 데 필요한 변수의 해시 참조. SSIndex.cmd는 원본 인덱스 스트림에 기록된 정보의 양을 줄이기 위해 단일 디버그 파일에서 사용하는 모든 원본 파일에 대해 이러한 변수를 캐시합니다. (2) SrcSrv.dll이 소스 제어에서 이 파일을 추출할 수 있도록 원본 인덱스 스트림에 쓸 파일 항목. 이 줄의 정확한 형식은 소스 제어 시스템에만 적용됩니다.

$TextString = $objref->LongName()

목적: 최종 사용자에게 소스 제어 공급자를 식별하는 설명 문자열을 제공합니다.

매개 변수: 없음

반환 값: 소스 제어 시스템의 설명이 포함된 이름.

@StreamVariableLines = $objref->SourceStreamVariables()

목적: 소스 제어 공급자가 각 디버그 파일의 원본 스트림에 소스 제어별 변수를 추가할 수 있도록 합니다. 샘플 모듈은 필요한 EXTRACT_CMD 및 EXTRACT_TARGET 변수를 작성하는 데 이 메서드를 사용합니다.

매개 변수: 없음

반환 값: 원본 스트림 변수에 대한 항목 목록