다음을 통해 공유


언어 사양 1

참고

이 항목에서는 SrcSrv의 내부 작업에 대해 설명합니다. 원본 경로의 작동 방식에 대한 일반적인 내용은 원본 경로를 참조하세요. SrcSrv 사용에 대한 자세한 내용은 SrcSrv 사용을 참조하세요. 환경에서 원본 로드의 현재 작업을 확인하려면 .srcnoisy(Noisy Source Loading)에 설명된 대로 노이즈 소스 로드를 사용하도록 설정합니다.

SrcSrv의 첫 번째 버전은 다음과 같이 작동합니다. (이 동작은 이후 버전에서 변경될 수 있습니다.)

먼저 클라이언트는 모든 원본 파일 추출의 기반으로 사용할 대상 경로를 사용하여 SrcSrvInit 를 호출합니다. 이 경로는 특수 변수 TARG에 저장됩니다.

DbgHelp은 모듈의 .pdb 파일을 로드할 때 .pdb 파일에서 SrcSrv 스트림을 추출하고 SrcSrvLoadModule을 호출하여 이 데이터 블록을 SrcSrv에 전달합니다.

그런 다음 DbgHelp에서 원본 파일을 가져와야 하는 경우 SrcSrvGetFile 을 호출하여 버전 제어에서 지정된 소스 파일을 검색합니다.

SrcSrv는 요청된 원본 사양과 정확히 일치하는 항목에 대해 데이터 블록의 모든 원본 파일 항목을 검토합니다. 이 일치 항목은 VAR1에서 찾을 수 있습니다.

SrcSrv가 항목을 찾은 후 특수 변수(VAR1, VAR2 등)를 이 원본 파일 항목의 내용으로 채웁니다. 그런 다음, 이러한 특수 변수를 사용하여 SRCSRVTRG 변수를 확인합니다.

다음은 특수 변수를 사용하여 SRCSRVTRG 변수를 확인하는 방법을 보여 줍니다. 원본 경로는 여전히 다음과 같이 가정합니다.

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

각 줄에는 하나 이상의 특수 변수의 해상도가 표시됩니다. 확인된 변수는 굵게 표시됩니다.

SRCSRVTRG=%sdtrg% 
SDTRG=%targ%\%var2%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
c:\src\%var2%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\%fnbksl%( sdktools/debuggers/srcsrv/shell.cpp )\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\ sdktools\debuggers\srcsrv\shell.cpp\%var4%\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\%fnfile%(%var1%)
c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\%fnfile%( c:\db\srcsrv\shell.cpp)
c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp

이 생성된 대상 경로가 고유하고 동일한 파일의 두 버전을 동일한 위치에 추출하는 것을 허용하지 않는 방법을 확인합니다.

이제 SrcSrv는 파일이 이미 있는지 확인합니다. 이 경우 SrcSrv는 호출자에게 위치를 반환합니다. 그렇지 않으면 SrcSrv는 SRCSRVCMD를 확인하여 파일을 추출하는 실행 명령을 빌드합니다.

다음 예제에서 각 줄은 하나 이상의 특수 변수의 해상도를 보여줍니다. 확인된 변수는 굵게 표시됩니다.

DEPOT=//depot 
WIN_SDKTOOLS= sserver.microsoft.com:4444 
SRCSRVCMD=%sdcmd% 
SDCMD=sd.exe -p %fnvar%(%var2%) print -o %srcsrvtrg% -q %depot%/%var3%#%var4% 
sd.exe -p %fnvar%(WIN_SDKTOOLS) print -o %srcsrvtrg% -q %depot%/%var3%#%var4% 
sd.exe -p sserver.microsoft.com:4444  print -o %srcsrvtrg% -q %depot%/%var3%#%var4% 
sd.exe -p sserver.microsoft.com:4444  print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q %depot%/%var3%#%var4% 
sd.exe -p sserver.microsoft.com:4444  print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q //depot/%var3%#%var4% 
sd.exe -p sserver.microsoft.com:4444  print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q //depot/ sdktools/debuggers/srcsrv/shell.cpp#%var4% 
sd.exe -p sserver.microsoft.com:4444  print -o c:\src\WIN_SDKTOOLS\sdktools\debuggers\srcsrv\shell.cpp\3\shell.cpp -q //depot/ sdktools/debuggers/srcsrv/shell.cpp#3 

이제 SrcSrv가 이 명령을 실행합니다. 이 명령의 결과가 예상 위치에 있는 파일인 경우 이 경로는 호출자에게 반환됩니다.

변수를 확인할 수 없는 경우 OS 환경 변수로 조회하려고 시도합니다. 실패하면 처리 중인 텍스트에서 변수 이름이 삭제됩니다.

연속 2%의 부호 문자는 단일 백분율 기호로 해석됩니다.

원본 서버 데이터 블록

SrcSrv는 .pdb 파일 내의 두 개의 데이터 블록, 원본 파일 목록 및 데이터 블록을 사용합니다.

원본 파일 목록은 모듈을 빌드할 때 자동으로 만들어집니다. 이 목록에는 모듈을 빌드하는 데 사용되는 원본 파일에 대한 정규화된 경로가 포함되어 있습니다.

데이터 블록은 원본 인덱싱 중에 만들어집니다. 이때 "srcsrv"라는 대체 스트림이 .pdb 파일에 추가됩니다. 이 데이터를 삽입하는 스크립트는 사용 중인 특정 빌드 프로세스 및 소스 제어 시스템에 따라 달라집니다.

데이터 블록은 ini, variables 및 source 파일의 세 가지 섹션으로 나뉩니다. 데이터 블록에는 다음 구문이 있습니다.

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

버전
언어 사양 버전입니다. 이 변수가 필요합니다. 현재 언어 사양에 따라 스크립트를 개발하는 경우 이 값을 1로 설정합니다. SrcSrv 클라이언트 코드는 값이 자체보다 큰 스크립트를 실행하려고 시도하지 않습니다. SrcSrv의 현재 버전은 2 값을 사용합니다.

VERCTRL
원본 버전 제어 시스템을 설명하는 문자열입니다. 이 변수는 선택 사항입니다.

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

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

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

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

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

SRCSRVVERCTRL
사용 중인 버전 제어 시스템을 지정합니다. Perforce의 경우 이는 perforce입니다. Team Foundation Server의 경우 tfs입니다. 이 변수는 서버 오류를 유지하는 데 사용됩니다. 옵션 변수입니다.

SRCSRVVERRDESC
버전 제어 클라이언트가 추출할 원본 파일이 포함된 서버에 연결할 수 없는 경우 표시할 텍스트를 지정합니다. SrcSrv는 이 값을 사용하여 연결 문제를 검사. 옵션 변수입니다.

SRCSRVERRVAR
파일 항목의 변수가 버전 제어 서버에 해당하는지 나타냅니다. SrcSrv는 이전 오류에 따라 작동하지 않는 명령을 식별하는 데 사용됩니다. 텍스트 형식은 varX 입니다. 여기서 X 는 표시되는 변수의 수입니다. 옵션 변수입니다.

데이터 블록의 [원본 파일] 섹션에는 인덱싱된 각 원본 파일에 대한 항목이 포함되어 있습니다. 각 줄의 내용은 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%

서버 오류 처리

클라이언트가 단일 버전 제어 서버에서 파일을 전혀 추출할 수 없는 경우가 있습니다. 서버가 네트워크 가동 중지 및 해제되었거나 사용자에게 원본에 액세스할 수 있는 적절한 권한이 없기 때문일 수 있습니다. 그러나 이 원본을 가져오는 데 시간이 오래 걸리면 속도가 크게 느려질 수 있습니다. 이 경우 사용할 수 없는 것으로 입증된 원본에서 추출하려는 시도를 사용하지 않도록 설정하는 것이 가장 좋습니다.

SrcSrv가 파일을 추출하지 못할 때마다 명령에서 생성된 출력 텍스트를 검사합니다. 이 명령의 일부가 SRCSRVERRDESC의 내용과 정확히 일치하는 경우 동일한 버전 제어 서버에 대한 모든 이후 명령을 건너뜁니다. SRCSRVERRDESC 변수 이름의 끝에 숫자 또는 임의의 텍스트를 추가하여 여러 오류 문자열을 정의할 수 있습니다. 예를 들면 다음과 같습니다.

SRCSRVERRDESC=lime: server not found
SRCSRVERRDESC_2=pineapple: network error

서버의 ID는 SRCSRVERRVAR에서 가져옵니다. 따라서 SRCSRVERRVAR에 "var2"가 포함되어 있고 .pdb 파일의 파일 항목은 다음과 같습니다.

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

변수 2에서 "TOOLS_PRJ"이 포함된 파일 항목을 사용하여 원본을 가져오려는 모든 시도는 무시됩니다.

Srcsrv.ini편집하여 디버거 클라이언트에 오류 표시기를 추가할 수도 있습니다. 자세한 내용은 포함된 srcsrv.ini 샘플 버전을 참조하세요.