Поделиться через


Расширенное использование SymSrv

SymSrv может доставлять файлы символов из централизованного хранилища символов. Это хранилище может содержать любое количество файлов символов, соответствующих любому количеству программ или операционных систем. Хранилище также может содержать двоичные файлы (это полезно при отладке минидампов).

Хранилище может содержать фактические файлы символов и бинарные файлы, или просто содержать указатели на файлы символов. Если хранилище содержит указатели, SymSrv извлекает фактические файлы непосредственно из источников.

SymSrv также можно использовать для разделения большого хранилища символов в меньшее подмножество, подходящее для специализированной задачи отладки.

Наконец, SymSrv может получить файлы символов из источника HTTP или HTTPS с помощью сведений о входе, предоставляемых операционной системой. SymSrv поддерживает сайты HTTPS, защищенные смарт-картами, сертификатами и обычными именами входа и паролями. Дополнительные сведения см. в разделе "Хранилища символов HTTP".

Задание пути символа

Чтобы использовать этот сервер символов, symsrv.dll необходимо установить в том же каталоге, что и отладчик. Путь к символам можно задать, как показано в этом коде:

set _NT_SYMBOL_PATH = symsrv*ServerDLL*DownstreamStore*\\Server\Share

set _NT_SYMBOL_PATH = symsrv*ServerDLL*\\Server\Share

set _NT_SYMBOL_PATH = srv*DownstreamStore*\\Server\Share

set _NT_SYMBOL_PATH = srv*\\Server\Share

Части этого синтаксиса описаны следующим образом:

symsrv
Это ключевое слово всегда должно отображаться первым. Он указывает отладчику, что этот элемент является сервером символов, а не просто обычным каталогом символов.

ServerDLL
Указывает имя библиотеки динамической компоновки (DLL) сервера символов. Если вы используете сервер символов SymSrv, это всегда будет symsrv.dll.

srv
Служит сокращением для symsrv*symsrv.dll.

DownstreamStore
Указывает последующее хранилище. Это локальный каталог или сетевая папка, которая будет использоваться для кэширования отдельных файлов символов.

Можно указать несколько нижестоящих хранилищ, разделенных звездочками. На этой странице описаны несколько нижестоящих хранилищ в разделе Каскадные Подчиненные Хранилища.

Если вы включаете две звездочки в строку, в которой обычно указывается нижнее хранилище, используется нижнее хранилище по умолчанию. Это хранилище будет находиться в подкаталоге sym домашнего каталога. По умолчанию домашний каталог используется для каталога установки отладчика; это можно изменить с помощью расширения !homedir или задания переменной среды DBGHELP_HOMEDIR.

Если DownstreamStore указывает каталог, который не существует, SymStore попытается создать его.

Если параметр DownstreamStore опущен и не включена дополнительная звездочка, то, другими словами, если вы используете srv с ровно одной звездочкой или symsrv с ровно двумя звездочками, то потоковое хранилище не создастся. Отладчик загружает все файлы символов непосредственно с сервера без кэширования их локально.

Заметка Если вы обращаетесь к символам из сайта HTTP или HTTPS, или если хранилище символов использует сжатые файлы, то нижнее хранилище всегда используется. Если последующее хранилище не указано, оно будет создано в подкаталоге sym домашнего каталога.

\\Server\Share
Указывает сервер и общий доступ к удаленному хранилищу символов.

Если используется нижнее хранилище, отладчик сначала будет искать файл символов в этом хранилище. Если файл символа не найден, отладчик найдет файл символов из указанного сервераи общего ресурса, а затем кэширует копию этого файла в нижнем хранилище. Файл будет скопирован в подкаталог в дереве под DownstreamStore, который соответствует его расположению в дереве под \\Server\Share.

Сервер символов не должен быть единственной записью в пути к символам. Если путь к символам состоит из нескольких записей, отладчик проверяет каждую запись для необходимых файлов символов в порядке (слева направо), независимо от того, называется ли сервер символов или фактический каталог.

Ниже приведены некоторые примеры. Чтобы использовать SymSrv в качестве сервера символов с хранилищем символов в \\mybuilds\mysymbols, задайте следующий путь к символам:

set _NT_SYMBOL_PATH= symsrv*symsrv.dll*\\mybuilds\mysymbols

Чтобы задать путь к символам так, чтобы отладчик копирует файлы символов из хранилища символов на \\mybuilds\mysymbols в ваш локальный каталог c:\localsymbols, используйте следующую команду:

set _NT_SYMBOL_PATH=symsrv*symsrv.dll*c:\localsymbols*\\mybuilds\mysymbols

Чтобы задать путь к символам, чтобы отладчик скопирует файлы символов с сайта https://www.company.com/manysymbols HTTPS в каталог локальной сети \\localserver\myshare\mycache, используйте следующую команду:

set _NT_SYMBOL_PATH=symsrv*symsrv.dll*\\localserver\myshare\mycache*https://www.company.com/manysymbols

Этот последний пример также можно сократить следующим образом:

set _NT_SYMBOL_PATH=srv*\\localserver\myshare\mycache*https://www.company.com/manysymbols

Кроме того, путь к символам может содержать несколько каталогов или серверов символов, разделенных точкой с запятой. Это позволяет находить символы из нескольких расположений (или даже нескольких серверов символов). Если двоичный файл имеет несовпадение файла символов, отладчик не может найти его с помощью сервера символов, так как он проверяет только точные параметры. Однако отладчик может найти несогласованный файл символов с правильным именем, используя традиционный путь к символам и успешно загрузить его. Несмотря на то, что файл технически не является правильным файлом символов, он может предоставить полезные сведения.

Удаление кэша

Если вы используете DownstreamStore в качестве кэша, вы можете удалить этот каталог в любое время, чтобы сэкономить место на диске.

Можно иметь обширное хранилище символов, включающее файлы символов для многих различных программ или версий Windows. При обновлении версии Windows, используемой на целевом компьютере, кэшированные файлы символов будут соответствовать предыдущей версии. Эти кэшированные файлы не будут использоваться в дальнейшем, и поэтому это может быть хорошим временем для удаления кэша.

Каскадные подчиненные магазины

Можно указать любое количество нижестоящих хранилищ, разделенных звездочками. Эти хранилища известны как каскадные хранилища символов.

После начального srv* или symsrv*ServerDLL* каждый последующий маркер представляет собой расположение символа. Сначала проверяется самый левый маркер. Пустой маркер, указанный двумя звездочками в строке или звездочкой в конце строки, представляет нижнее хранилище по умолчанию.

Ниже приведен пример пути символа, использующего два подчиненных хранилища для хранения сведений из основного хранилища символов, к которому осуществляется доступ. Их можно назвать главным хранилищем, хранилищем среднего уровня и локальным кэшем:

srv*c:\localcache*\\interim\store*https://msdl.microsoft.com/download/symbols

В этом сценарии SymSrv сначала будет искать в папке c:\localcache файл символов. Если объект найден, он вернет путь к нему. Если он не найден там, будет искать в \\interim\store. Если файл символов найден там, SymSrv скопируйт его в c:\localcache и возвратит путь. Если он не найден, SymSrv будет искать в общедоступном хранилище символов Майкрософт https://msdl.microsoft.com/download/symbols; если файл найден там, SymSrv скопирует его в \\промежуточный\store и c:\localcache.

Аналогичное поведение будет получено с помощью следующего пути:

srv**\\interim\store*https://internetsite

В этом случае локальный кэш — это нижнее хранилище по умолчанию, а главное хранилище — интернет-сайт. Для использования между двумя другими указано промежуточное хранилище \\interim\store.

Когда SymSrv обрабатывает путь, содержащий каскадные хранилища, он пропускает любое хранилище, в которое оно не может читать или записывать данные. Таким образом, если доля (ресурс) станет недоступной, файл будет скопирован в хранилище, расположенное следом за отсутствующим хранилищем, без каких-либо ошибок. Хороший побочный эффект этой ошибки заключается в том, что пользователь может указать несколько основных хранилищ, которые питают поток зависимых хранилищ, если только основные хранилища не могут быть записаны.

Когда сжатый файл символов извлекается из главного хранилища, он будет храниться в сжатой форме в любом хранилище среднего уровня. Файл будет распакован в самом нижнем хранилище на пути.

Работа с путями сервера символов HTTP и SMB

Как упоминалось ранее, цепочка (или каскадная) относится к копированию, которое происходит между каждым разделителем "*" в пути символов. Символы ищутся в порядке слева направо. При каждой промахе следующий (вышестоящий) сервер символов запрашивается до тех пор, пока файл не будет найден.

При обнаружении файл копируется с сервера символов (вышестоящего) на предыдущий (подчиненный) сервер символов. Это повторяется для каждого (нижнего) сервера символов. Таким образом, общие подчиненные серверы символов заполняются коллективными усилиями всех клиентов, их использующих.

Несмотря на то, что UNC-пути можно использовать без префикса SRV*, рекомендуется указать SRV*, чтобы можно было использовать расширенную обработку ошибок symsrv.dll.

При включении http-сервера символов в путь можно указать только один (для каждой цепочки), и он должен быть в конце пути (так как его нельзя использовать для кэширования). Если хранилище символов на основе HTTP находится в середине или слева от списка магазинов, то не удастся скопировать в него все найденные файлы, и цепочка будет нарушена. Кроме того, поскольку обработчик символов не может открыть файл с веб-сайта, хранилище на основе HTTP не должно быть самым левым или единственным хранилищем в списке. Если SymSrv когда-либо сталкивается с этим путем символов, он попытается восстановиться, скопировав файл в потоковое хранилище по умолчанию и открыв его оттуда, независимо от того, указано ли потоковое хранилище по умолчанию в пути символов или нет.

HTTP поддерживается только при использовании префикса SRV* (реализованного обработчиком символов symsrv.dll).

Примеры сценариев сервера символов HTTP и SMB Share

Обычное развертывание, использующее только UNC, включает в себя центральный офис, в котором размещаются все файлы (\\MainOffice\Symbols), филиалы кэшируют подмножество (\\BranchOfficeA\Symbols) и настольные компьютеры (C:\Symbols) кэшируют файлы, на которые они ссылаются.

srv*C:\Symbols*\\BranchOfficeA\Symbols*\\MainOffice\Symbols

Если общая папка SMB является основным (вышестоящим) хранилищем символов, требуется чтение.

srv*C:\Symbols*\\MachineName\Symbols

Если общий ресурс SMB является промежуточным хранилищем символов, требуются права на чтение и изменение. Клиент копирует файл из основного хранилища символов в общую папку SMB, а затем из общей папки SMB в локальную папку.

srv*C:\Symbols*\\MachineName\Symbols*https://msdl.microsoft.com/download/symbols
srv*C:\Symbols*\\MachineName\Symbols*\\MainOffice\Symbols

Если общая папка SMB является промежуточным хранилищем символов в развертывании SymProxy, требуется только чтение. Фильтр ISAPI SymProxy выполняет записи, а не клиент.

srv*C:\Symbols*\\MachineName\Symbols*https://SymProxyName/Symbols

Несколько сценариев кэша сервера символов HTTP и SMB

Можно указать несколько цепочек серверов символов и расположений кэша, разделенных точкой с запятой ";". Если символы расположены в первой цепочке, вторая цепочка не обрабатывается. Если символы не находятся в первой цепочке, то вторая цепочка будет пройдена и если символы находятся во второй цепочке, они будут кэшироваться в указанном расположении. Этот подход позволит использовать основной сервер символов в обычном режиме, при этом вторичный сервер используется только в случае, если символы недоступны на основном сервере символов, указанном в первой цепочке.

srv*C:\Symbols*\\Machine1\Symbols*https://SymProxyName/Symbols;srv*C:\WebSymbols*https://msdl.microsoft.com/download/symbols

cache*localsymbolcache

Другим способом создания локального кэша символов является использование строки cache*localsymbolcache в пути символов. Это не часть сервера символов, а отдельный элемент в вашем пути к символам. Отладчик будет использовать указанный каталог localsymbolcache для хранения любых символов, загруженных из любого элемента, который появляется в вашем пути символов справа от этой строки. Это позволяет использовать локальный кэш для символов, скачанных из любого расположения, а не только тех, которые скачиваются сервером символов.

Например, следующий путь к символам не будет кэшировать символы, взятые из \\someshare. Он будет использовать c:\mysymbols для кэширования символов, взятых из \\anothershare, так как элемент, начинаемый с \\anothershare , отображается справа от элемента cache*c:\mysymbols . Он также будет использовать c:\mysymbols для кэширования символов, взятых из общедоступного хранилища символов Майкрософт, из-за обычного синтаксиса, используемого сервером символов (srv с двумя или более звездочками). Кроме того, если вы впоследствии используете команду Sympath+ для добавления дополнительных расположений в этот путь, эти новые элементы также будут кэшированы, так как они будут добавлены в правую сторону пути.

_NT_SYMBOL_PATH=\\someshare\that\cachestar\ignores;srv*c:\mysymbols*https://msdl.microsoft.com/download/symbols;cache*c:\mysymbols;\\anothershare\that\gets\cached

Как SymSrv находит файлы

SymSrv создает полный UNC-путь к нужному файлу символов. Этот путь начинается с пути к хранилищу символов, записанного в переменной среды _NT_SYMBOL_PATH. Затем подпрограмма SymbolServer используется для идентификации имени нужного файла; это имя добавляется к пути в качестве имени каталога. Другое имя каталога, состоящее из объединения идентификатора, двух и трех параметров, передаваемых в SymbolServer, затем добавляется. Если любое из этих значений равно нулю, они опущены.

В результирующем каталоге производится поиск файла символов или указателя на файл хранилища символов.

Если этот поиск выполнен успешно, SymbolServer передает путь вызывающему объекту и возвращает TRUE. Если файл не найден, SymbolServer возвращает значение FALSE.

Использование AgeStore для уменьшения размера кэша

Средство AgeStore можно использовать для удаления кэшированных файлов, которые старше указанной даты, или для уменьшения содержимого кэша ниже указанного размера. Это может быть полезно, если последующее хранилище данных слишком велико. Дополнительные сведения см. в статье AgeStore.