Использование SymChk

Базовый синтаксис для SymChk выглядит следующим образом:

symchk [/r] FileNames /s SymbolPath 

FileNames указывает один или несколько программных файлов, символы которых необходимы. Если FileNames является каталогом и используется флаг /r , этот каталог изучается рекурсивно, и SymChk попытается найти символы для всех программных файлов в этом дереве каталогов. SymbolPath указывает, где SymChk будет искать символы.

Существует множество других параметров командной строки. Полный список см. в разделе Параметры Command-Line SymChk.

Получение символа

Symchk, как и другие средства отладки, поставляется в составе отладчика. Дополнительные сведения см. в разделе Debugging Tools for Windows (на английском языке).

После установки средств отладки в этом каталоге для 64-разрядной версии Windows будет доступна функция symchk.

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

Example Usage (Пример использования)

Указанный путь к символам может включать любое количество локальных каталогов, 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, если она доступна. (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

На этот раз поиск был успешным. Если параметр 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

См. также:

Параметры Command-Line SymChk

Использование серверов символов и хранилищ символов