使用 SymChk

SymChk 的基本语法如下所示:

symchk [/r] FileNames /s SymbolPath 

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

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

获取 symc功能

与其他调试工具一样,Symc功能作为调试器一部分提供。 有关详细信息,请参阅下载调试工具 for Windows

安装调试工具后,symc分库在此目录中可用于 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 可用,调试器可以选择除 SymSrv 外的其他符号服务器 DLL。 (SymSrv 是 package.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 /ss 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

这次搜索成功。 如果未使用 verbose 选项,则 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 命令行选项

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