다음을 통해 공유


원본 서버

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

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

원본 인덱싱

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

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

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

  • Team Foundation Server
  • Perforce
  • Visual SourceSafe
  • CVS
  • 전복

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

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

도구 묘사
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 섹션에는 요구 사항을 설명하는 변수가 포함되어 있습니다. 인덱싱 스크립트는 이 섹션에 임의의 수의 변수를 추가할 수 있습니다. 다음은 예제입니다.

버전

언어 사양 버전입니다. 이 변수는 필수입니다.

VERCTL

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

DATETIME

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

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

SRCSRVTRG

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

SRCSRVCMD

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

SRCSRVENV

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

원본 파일 섹션에는 인덱싱된 각 원본 파일에 대한 항목이 포함되어 있습니다. 각 줄의 내용은 VAR10까지 VAR1, VAR2, VAR3 등의 이름을 가진 변수로 해석됩니다. 변수는 별표로 구분됩니다. 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%) 인쇄 -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을 사용하여 SRCSRVTRG 변수를 VARn확장합니다. 파일이 이미 이 위치에 있으면 해당 위치를 호출자에게 반환합니다. 그렇지 않으면 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 변수를 작성합니다.

매개 변수: 없음

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