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


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

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

Хранилище может содержать фактические файлы символов и двоичных файлов или просто содержать указатели на файлы символов. Если хранилище содержит указатели, 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.

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

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

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

Чтобы задать путь к символам, чтобы отладчик скопирует файлы символов из хранилища символов в папку \\mysymbols\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 для файла символов. Если он найден там, он вернет путь к нему. Если он не найден, он будет выглядеть в \\промежуточный\store. Если файл символов найден там, SymSrv скопируйт его в c:\localcache и возвратит путь. Если он не найден, SymSrv будет выглядеть в общедоступном хранилище https://msdl.microsoft.com/download/symbolsсимволов Майкрософт; если файл найден там, SymSrv скопировать его в \\промежуточный\store и c:\localcache.

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

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

В этом случае локальный кэш — это нижнее хранилище по умолчанию, а главное хранилище — интернет-сайт. Средний уровень хранилища \\промежуточный\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.