Использование 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