語言規格 1
注意
本主題描述 SrcSrv 的內部作業。 如需來源路徑運作方式的一般資訊,請參閱 來源路徑。 如需使用 SrcSrv 的詳細資訊,請參閱 使用 SrcSrv。 若要判斷環境中來源載入的目前作業,請啟用雜訊來源載入,如.srcnoisy (雜訊來源載入) 所述
第一個版本的 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 環境變數。 如果失敗,則會從正在處理的文字中刪除變數名稱。
兩個連續百分比符號字元會解譯為單一百分比符號。
源伺服器資料區塊
SrcSrv 依賴 .pdb 檔案內的兩個數據區塊、原始程式檔清單和資料區塊。
建置模組時,會自動建立來源檔案清單。 此清單包含用來建置模組之原始程式檔的完整路徑。
資料區塊會在來源索引編制期間建立。 此時,名為 「srcsrv」 的替代資料流程會新增至 .pdb 檔案。 插入此資料的腳本取決於使用中的特定建置程式和原始檔控制系統。
資料區塊分成三個區段: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] 區段包含描述需求的變數。 索引編制腳本可以將任意數目的變數新增至此區段。 範例如下:
版本
語言規格版本。 這是必要變數。 如果您根據目前的語言規格開發腳本,請將此值設定為 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
從 SRCSRVERRVAR 取得伺服器的身分識別。 因此,如果 SRCSRVERRVAR 包含 「var2」,且 .pdb 檔案中的檔案專案看起來像這樣:
c:\proj\src\file.cpp*TOOLS_PRJ*tools/mytool/src/file.cpp*3
系統會略過所有未來嘗試使用變數 2 中包含 「TOOLS_PRJ」 的檔案專案來取得來源。
您也可以編輯 Srcsrv.ini,在 偵錯工具用戶端上新增錯誤指標。 如需詳細資訊,請參閱包含的範例版本 srcsrv.ini。