Share via


使用 PDBCopy

PDBCopy 是命令列工具,可從完整符號檔建立移除的符號檔。 換句話說,它會採用包含私用符號資料和公用符號資料表的符號檔,並建立該檔案的複本,該檔案只包含公用符號資料表。 根據使用的 PDBCopy 選項而定,等量符號檔包含整個公用符號表或公用符號表的指定子集。

如需 WDK 中 PDBCopy 的位置,請參閱Windows 偵錯工具中包含的工具中的安裝目錄

PDBCopy 可與副檔名為 .pdb () 的任何 PDB 格式符號檔搭配使用,但不適用於舊格式 (.dbg) 符號檔。

如需公用符號表和私用符號資料的描述,請參閱 公用和私人符號

移除私人符號

如果您想要建立包含所有公用符號和無私人符號的等量符號檔,請使用 PDBCopy 搭配三個參數:原始符號檔的路徑和名稱、新符號檔的路徑和名稱,以及 -p 選項。

例如,下列命令會建立名為 publicsymbols.pdb 的新檔案,其中包含與 mysymbols.pdb 相同的公用符號資料表,但不包含任何私人符號資料:

pdbcopy mysymbols.pdb publicsymbols.pdb -pdb

如果 mysymbols.pdb 已經是等量符號檔,則新檔案和舊檔案的符號內容將會相同。

發出此命令之後,您應該將新檔案移至新位置,並將它重新命名為本範例中 (符號檔的原始名稱 mysymbols.pdb) ,因為大部分的偵錯程式和符號擷取程式會根據特定檔案名尋找符號。 或者,只要指定不同的目錄,您就可以針對輸入檔和 PDBCopy 命令列上的輸出檔案使用相同的檔案名:

pdbcopy c:\dir1\mysymbols.pdb c:\dir2\mysymbols.pdb -pdb

注意 執行 PDBCopy 之前,目的地檔案不應該存在。 如果具有此名稱的檔案存在,可能會發生各種錯誤。

移除私人符號和選取的公用符號

如果您想要不僅移除私人符號資料,也減少公用符號資料表中的資訊量,您可以使用 -f 選項來指定要移除的公用符號清單。

下列範例說明此程式:

  1. 決定您想要移除之符號的完整名稱,包括裝飾。 如果您不確定裝飾的符號名稱,您可以使用 DBH 工具來判斷它們。 如需詳細資訊,請參閱判斷特定符號的裝飾。 在此範例中,讓我們假設您想要移除的符號裝飾名稱 _myGlobal1_myGlobal2

  2. 建立包含要移除之符號清單的文字檔。 此檔案中的每個行都應該包含一個符號的名稱,包括裝飾,但不包括模組名稱。 在此範例中,檔案會包含下列兩行:

    _myGlobal1
    _myGlobal2
    

    您可以為您選擇的任何名稱指定檔案。 讓我們假設您將此檔案命名listfile.txt,並將其放在 C:\Temp 目錄中。

  3. 使用下列 PDBCopy 命令列:

    pdbcopy OldPDB NewPDB -p -f:@TextFile
    

    其中 OldPDBNewPDB 是原始的符號檔和新的符號檔,而 TextFile 則是在步驟二中建立的檔案。 -f 選項表示要移除某些公用符號,而 ampersand ( @ ) 表示這些符號列在指定的文字檔中。

    在目前的範例中,命令看起來會像這樣:

    pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:@c:\temp\listfile.txt
    

    這會建立新的符號檔 C:\dir3\mysymbols.pdb,此檔案不包含任何私用符號,且不包含您在listfile.txt中列出的兩個全域變數。

如本範例所示,PDBCopy 的 -f 選項會移除特定公用符號清單。 ampersand ( @ ) 表示這些符號列在文字檔中。 替代方法是使用不含 ampersand 的 -f 選項,列出命令列上的所有符號。 因此,下列命令列相當於上述程式中的範例:

pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:_myGlobal1 -f:_myGlobal2

除非您只想要移除一或兩個符號,否則使用文字檔比在命令列上列出它們更簡單。

如果您想要從 .pdb 檔案中移除大部分的公用符號,-F 選項是最簡單的方法。 雖然 -f 選項要求您列出您想要移除的公用符號,但 -F 選項會要求您列出您不想要移除的公用符號。 將會移除所有其他公用符號 (以及所有私人符號) 。 -F 選項支援與 -f 選項相同的兩個語法選項:-F:後面接著要保留的符號名稱,或 -F:@ 後面接著包含要保留之符號清單的文字檔名稱。 不論是哪一種情況,都必須使用裝飾符號名稱。

例如,下列命令會移除所有私用符號和幾乎所有公用符號,只保留符號 _myFunction5_myGlobal7

pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -F:_myFunction5 -F:_myGlobal7

如果您在一行結合多個 -f 選項實例,則會移除所有指定的符號。 如果您在一行結合多個 -F 選項實例,則會保留所有指定的符號,並移除所有其他符號。 您無法將 -f 與 -F 結合。

若沒有 -p 選項,就無法使用 -f 和 -F 選項,這會移除所有私人符號資料。 即使您的原始檔案未包含私人符號,您仍必須包含 -p 選項 (,但在此案例中沒有作用) 。

-F 選項無法用來防止移除私人符號資料。 如果您使用此選項搭配未包含在公用符號資料表中的符號,PDBCopy 會忽略它。

mspdb*.dll 檔案

PDBCopy 必須存取Mspdb80.dll檔案或Mspdb60.dll檔案才能執行。 根據預設,PDBCopy 會使用 Mspdb80.dll,這是 Visual Studio .NET 2002 和更新版本的 Visual Studio 所使用的版本。 如果您的符號是使用 Visual Studio 6.0 或舊版所建置的,您可以指定 -vc6 命令列選項,讓 PDBCopy 改用 Mspdb60.dll,但這不是必要的。 即使未使用 -vc6 選項,PDBCopy 仍會尋找適當的檔案。 您可以在安裝 Visual Studio、平臺 SDK 或 Windows 驅動程式套件 (WDK) 中找到這些檔案。

在執行 PDBCopy 之前,請確定您的電腦可以存取正確的 mspdb*.dll 檔案版本,並確定其位置是命令路徑的一部分。 如果沒有,您應該使用 path 命令將這個位置新增至命令路徑。

檔案簽章和 SymSrv 索引

每個符號檔都有可唯一識別它的固定簽章。 SymSrv 會使用簽章來產生檔案的唯一「索引值」。 如果兩個檔案有不同的內容或不同的建立時間,它們也會有不同的簽章和不同的 SymSrv 索引值。

使用 PDBCopy 建立的檔案是唯一索引值規則的例外狀況。 當 PDBCopy 建立新的符號檔時,它具有與舊檔案相同的簽章和 SymSrv 索引值。 這項功能可讓一個檔案取代為另一個檔案,而不會改變符號相關工具的行為。

如果您希望新檔案具有不同的簽章和 SymSrv 索引,請使用 -s 選項。 在大部分情況下,您不想要使用此選項,因為最常見的 PDBCopy 用法是建立改變的符號檔,以取代舊檔案,而不會造成不符。 新的簽章可能會導致 SymSrv 將不同于新檔案的索引值指派給新檔案,以防止新檔案正確取代舊的檔案。

如需完整的命令列語法,請參閱 PDBCopy Command-Line Options