使用 SymChk

SymChk 的基本语法如下:

symchk [/r] FileNames /s SymbolPath 

FileNames 指定需要其符号的一个或多个程序文件。 如果 FileNames 是一个目录,并且使用了 /r 标志,则以递归方式浏览此目录,SymChk 将尝试在此目录树中查找所有程序文件的符号。 SymbolPath 指定 SymChk 搜索符号的位置。

还有更多命令行选项。 有关完整列表,请参阅 SymChk Command-Line 选项

获取 symchk

与其他调试工具一样,Symchk 作为调试器的一部分提供。 有关详细信息,请参阅 Debugging Tools for Windows(Windows 调试工具)。

安装调试工具后,symchk 将在此目录中用于 64 位 Windows。

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

示例用法

指定的符号路径可以包含任意数量的本地目录、UNC 目录或符号服务器。 本地目录和 UNC 目录不以递归方式搜索。 仅搜索指定的目录和基于可执行文件的扩展的子目录。 例如,查询

symchk thisdriver.sys /s G:\symbols 

将搜索 G:\mysymbols 和 G:\mysymbols\sys。

可以通过使用以下任一语法作为符号路径的一部分来指定符号服务器:

srv*DownstreamStore*\\Server\Share
srv*\\Server\Share

这与在调试器的符号路径中使用符号服务器非常相似。 有关此内容的详细信息,请参阅 使用符号服务器和符号存储

如果指定了下游存储,SymChk 将复制符号服务器找到的所有有效符号文件,并将其放置在下游存储中。 仅将完全匹配的符号文件复制到下游。

SymChk 始终在查询符号服务器之前搜索下游存储。 因此,当其他人维护符号存储时,应小心使用下游存储。 如果运行 SymChk 一次并找到符号文件,则会将这些符号文件复制到下游存储。 如果在符号存储上更改或删除这些文件后再次运行 SymChk,SymChk 将不会注意到这一事实,因为它会在下游存储中找到它正在查找的内容,而不再查找。

注意 SymChk 始终使用 SymSrv (Symsrv.dll) 作为其符号服务器 DLL。 另一方面,如果符号服务器 DLL 可用,调试器可以选择符号服务器 DLL 而不是 SymSrv。 (SymSrv 是 Windows 调试工具包中包含的符号服务器。)

使用 SymChk 确定符号是私有符号还是公共符号

若要确定符号文件是私有还是公共,请使用 /v 参数,以便 SymChk 显示详细输出。 假设 MyApp.exe 和 MyApp.pdb 位于 c:\sym 文件夹中。 输入此命令:

symchk /v C:\sym\MyApp.exe /s C:\sym**

如果 MyApp.pdb 包含专用符号,则 SymChk 的输出如下所示。

[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - private symbols & lines
        c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

如果 MyApp.pdb 仅包含公共符号,则 SymChk 的输出如下所示。

[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - public symbols
        c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

若要限制搜索,使其仅查找公共符号文件,请将 s 选项与 /s 参数 (/ss) 。 如果 MyApp.pdb 仅包含公共符号,则以下命令将查找匹配项。 如果 MyApp.pdb 包含私有符号,则找不到匹配项。

symchk /v C:\sym\MyApp.exe /s C:\sym

有关详细信息,请参阅 公共符号和专用符号

示例

下面是一些示例。 以下命令搜索程序 Myapp.exe 的符号:

E:\debuggers> symchk F:\myapp.exe /s F:\symbols\applications 

SYMCHK: Myapp.exe           FAILED  - Myapp.pdb is missing

SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 0

可以使用其他符号路径重试:

E:\debuggers> symchk F:\myapp.exe /s F:\symbols\newdirectory 

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

这次搜索成功。 如果未使用详细选项,SymChk 将仅列出找不到符号的文件。 因此,在此示例中未列出任何文件。 可以判断搜索成功,因为“已通过”类别中列出了一个文件,“失败”类别中没有文件。

如果程序文件不包含可执行代码,则忽略它。 许多资源文件属于此类型。

如果希望查看所有程序文件的文件名,可以使用 /v 选项生成详细输出:

E:\debuggers> symchk /v F:\myapp.exe /s F:\symbols\newdirectory 

SYMCHK: MyApp.exe           PASSED

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

以下命令在符号服务器中搜索大量 Windows 符号。 可能存在多种错误消息:

E:\debuggers> symchk /r C:\windows\system32 /s srv*\\manysymbols\windows 

SYMCHK: msisam11.dll         FAILED  - MSISAM11.pdb is missing
SYMCHK: msuni11.dll          FAILED  - msuni11link.pdb is missing
SYMCHK: msdxm.ocx            FAILED  - Image is split correctly, but msdxm.dbg i
s missing
SYMCHK: expsrv.dll           FAILED  - Checksum doesn't match with expsrv.DBG
SYMCHK: imeshare.dll         FAILED  - imeshare.opt.pdb is missing
SYMCHK: ir32_32.dll          FAILED  - Built with no debugging information
SYMCHK: author.dll           FAILED  - rpctest.pdb is missing
SYMCHK: msvcrt40.dll         FAILED  - Built with no debugging information
......
SYMCHK: FAILED files = 211
SYMCHK: PASSED + IGNORED files = 4809

另请参阅

SymChk 命令行选项

使用符号服务器和符号存储