使用 PDBCopy

PDBCopy 是一种命令行工具,用于从完整符号文件创建去除符号文件。 换句话说,它采用同时包含私有符号数据和公共符号表的符号文件,并创建仅包含公共符号表的文件的副本。 根据使用的 PDBCopy 选项,去除符号文件包含整个公共符号表或公共符号表的指定子集。

有关 PDBCopy 在 WDK 中的位置,请参阅 Windows 调试工具中包含的工具中的安装目录

PDBCopy 适用于文件扩展名为 .pdb) 的任何 PDB 格式符号文件 (,但不适用于较旧格式 (.dbg) 符号文件。

有关公共符号表和私有符号数据的说明,请参阅 公共符号和专用符号

删除私有符号

如果要创建包含所有公共符号且不包含私有符号的剥离符号文件,请使用 PDBCopy 和三个参数:原始符号文件的路径和名称、新符号文件的路径和名称以及 -p 选项。

例如,以下命令创建一个名为 publicsymbols.pdb 的新文件,该文件包含与 mysymbols.pdb 相同的公共符号表,但不包含私有符号数据:

pdbcopy mysymbols.pdb publicsymbols.pdb -p

如果 mysymbols.pdb 恰好已经是一个去除的符号文件,则新文件和旧文件的符号内容将相同。

发出此命令后,应将新文件移动到新位置,并将其重命名为符号文件的原始名称 (在此示例中为 mysymbols.pdb) ,因为大多数调试程序和符号提取程序会根据特定文件名查找符号。 或者,只要指定了不同的目录,就可以对 PDBCopy 命令行上的输入文件和输出文件使用相同的文件名:

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

注意 在运行 PDBCopy 之前,目标文件不应存在。 如果存在具有此名称的文件,则可能会出现各种错误。

删除私有符号和选定的公共符号

如果不仅要删除私有符号数据,还要减少公共符号表中的信息量,可以使用 -f 选项指定要删除的公共符号的列表。

以下示例演示了此过程:

  1. 确定要删除的符号的全名(包括修饰)。 如果不确定修饰符号名称,可以使用 DBH 工具来确定它们。 有关详细信息,请参阅确定特定符号的修饰。 在此示例中,假设要删除的符号的修饰名称 _myGlobal1_myGlobal2

  2. 创建包含要删除的符号列表的文本文件。 此文件中的每一行都应包含一个符号的名称,包括修饰,但不包括模块名称。 在此示例中,文件将包含以下两行:

    _myGlobal1
    _myGlobal2
    

    可以为文件指定你选择的任何名称。 假设将此文件命名listfile.txt,并将其放在目录 C:\Temp 中。

  3. 使用以下 PDBCopy 命令行:

    pdbcopy OldPDB NewPDB -p -f:@TextFile
    

    其中 ,OldPDBNewPDB 是原始符号文件和新符号文件, TextFile 是在步骤 2 中创建的文件。 -f 选项指示要删除某些公共符号,和号 ( @ ) 指示这些符号列在指定的文本文件中。

    在当前示例中,命令如下所示:

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

    这会创建一个新的符号文件 C:\dir3\mysymbols.pdb,该文件不包含任何私有符号,并且不包含listfile.txt中列出的两个全局变量。

如本示例所示,PDBCopy 的 -f 选项会删除公共符号的特定列表。 @ ) 的和号 (指示这些符号在文本文件中列出。 另一种方法是列出命令行上的所有符号,使用不带和号的 -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 选项