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

SymStore (symstore.exe) — это средство для создания хранилищ символов. Он включен в пакет средств отладки для Windows .

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

Обратите внимание, что на одном сервере нельзя хранить несколько версий PDB-файлов символов (например, общедоступных и частных версий), так как они содержат одну и ту же подпись и возраст.

Транзакции SymStore

Каждый вызов SymStore записывается как транзакция. Существует два типа транзакций: добавление и удаление.

При создании хранилища символов каталог с именем "000admin" создается под корнем сервера. Каталог 000admin содержит один файл для каждой транзакции, а также файлы журнала Server.txt и History.txt. Файл Server.txt содержит список всех транзакций, которые сейчас находятся на сервере. Файл History.txt содержит хронологическую историю всех транзакций.

Каждый раз, когда SymStore сохраняет или удаляет файлы символов, создается новый номер транзакции. Затем файл, имя которого является этим номером транзакции, создается в 000admin. Этот файл содержит список всех файлов или указателей, добавленных в хранилище символов во время этой транзакции. Если транзакция удаляется, SymStore считывает его файл транзакции, чтобы определить, какие файлы и указатели следует удалить.

Параметры добавления и del указывают, должна ли выполняться транзакция добавления или удаления. В том числе параметр /p с операцией добавления указывает, что нужно добавить указатель; не указан параметр /p, указывающий, что фактический файл символов должен быть добавлен.

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

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

Полный список всех параметров SymStore см. в разделе "Параметры командной строки SymStore".

Примечание.

SymStore не поддерживает одновременные транзакции от нескольких пользователей. Рекомендуется назначить одного пользователя администратором хранилища символов и отвечать за все операции добавления и del транзакций.

 

Примеры транзакций

Ниже приведены два примера добавления указателей символов для сборки 3790 Windows Server 2003 в \\sampledir\symsrv:

symstore add /r /p /f \\BuildServer\BuildShare\3790free\symbols\*.*
   /s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 free"
   /c "Sample add"
symstore add /r /p /f \\BuildServer\BuildShare\3790Chk\symbols\*.* 
   /s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 checked"
   /c "Sample add"

В следующем примере SymStore добавляет фактические файлы символов для проекта приложения в \\largeapp\appserver\bins в \\testdir\symsrv:

symstore add /r /f \\largeapp\appserver\bins\*.* /s \\testdir\symsrv 
   /t "Large Application" /v "Build 432" /c "Sample add"

Ниже приведен пример использования файла индекса. Во-первых, SymStore создает файл индекса на основе коллекции файлов символов в \\largeapp\appserver\bins\. В этом случае файл индекса помещается на третий компьютер, \\hubserver\hubshare. Параметр /g позволяет указать, что префикс файла "\\largeapp\appserver" может измениться в будущем:

symstore add /r /p /g \\largeapp\appserver /f 
   \\largeapp\appserver\bins\*.* 
   /x \\hubserver\hubshare\myindex.txt

Теперь предположим, что вы перемещаете все файлы символов с компьютера \\largeapp\appserver и помещаете их в \\myarchive\appserver. Затем можно создать само хранилище символов из файла индекса \\hubserver\hubshare\myindex.txt следующим образом:

symstore add /y \\hubserver\hubshare\myindex.txt 
   /g \\myarchive\appserver /s \\sampledir\symsrv /p 
   /t "Large Application" /v "Build 432" /c "Sample Add from Index"

Наконец, ниже приведен пример удаления файла SymStore, добавленного предыдущей транзакцией. В следующем разделе описано, как определить идентификатор транзакции (в данном случае 0000000096).

symstore del /i 0000000096 /s \\sampledir\symsrv

Сжатые файлы

SymStore можно использовать с сжатыми файлами двумя разными способами.

  1. Используйте SymStore с параметром /p для хранения указателей на файлы символов. После завершения SymStore сжимайте файлы, на которые ссылаются указатели.
  2. Используйте SymStore с параметром /x для создания файла индекса. После завершения SymStore сжать файлы, перечисленные в файле индекса. Затем используйте SymStore с параметром /y (и, если вы хотите, параметр /p ) для хранения файлов или указателей на файлы в хранилище символов. (SymStore не потребуется распаковать файлы для выполнения этой операции.)

Сервер символов будет отвечать за распаковку файлов при необходимости.

Если вы используете SymSrv в качестве сервера символов, любое сжатие должно выполняться с помощью средства compress.exe, распределенного с помощью пакета SDK для Microsoft Windows. Сжатые файлы должны иметь знак подчеркивания в качестве последнего символа в расширениях файлов (например, module1.pd_ или module2.db_). Дополнительные сведения см. в разделе Using SymSrv.

Файлы server.txt и history.txt

При добавлении транзакции несколько элементов информации добавляются в server.txt и history.txt для будущих возможностей поиска. Ниже приведен пример строки в server.txt и history.txt для добавления транзакции:

0000000096,add,ptr,10/09/99,00:08:32,Windows XP,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,

Это строка, разделенная запятыми. Поля определяются следующим образом.

Поле Description
0000000096 Номер идентификатора транзакции, созданный SymStore.
add Тип транзакции. Это поле может быть добавлено или del.
ptr Добавлены ли файлы или указатели. Это поле может быть файлом или ptr.
10/09/99 Дата возникновения транзакции.
00:08:32 Время начала транзакции.
Windows XP Продукт.
x86 fre Версия (необязательно).
Добавлено из Комментарий (необязательно)
Не используется (Зарезервировано для последующего использования.)

 

Ниже приведены некоторые примеры строк из файла транзакций 0000000096. Каждая строка записывает каталог и расположение файла или указателя, добавленного в каталог.

canon800.dbg\35d9fd51b000,\\mybuilds\symbols\sp4\dll\canon800.dbg
canonlbp.dbg\35d9fd521c000,\\mybuilds\symbols\sp4\dll\canonlbp.dbg
certadm.dbg\352bf2f48000,\\mybuilds\symbols\sp4\dll\certadm.dbg
certcli.dbg\352bf2f1b000,\\mybuilds\symbols\sp4\dll\certcli.dbg
certcrpt.dbg\352bf04911000,\\mybuilds\symbols\sp4\dll\certcrpt.dbg
certenc.dbg\352bf2f7f000,\\mybuilds\symbols\sp4\dll\certenc.dbg

При использовании транзакции del для отмены исходных транзакций добавления эти строки будут удалены из server.txt, а следующая строка будет добавлена в history.txt:

0000000105,del,0000000096

Поля для транзакции удаления определяются следующим образом.

Поле Description
0000000105 Номер идентификатора транзакции, созданный SymStore.
del Тип транзакции. Это поле может быть добавлено или del.
0000000096 Удаленная транзакция.

 

Формат символов служба хранилища

SymStore использует файловую систему в качестве базы данных. Он создает большое дерево каталогов с именами каталогов на основе таких вещей, как метки времени файла символов, подписи, возраст и другие данные.

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

Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999  05:46p      <DIR>          .
10/06/1999  05:46p      <DIR>          ..
10/04/1999  01:54p      <DIR>          37cdb03962040
10/04/1999  01:49p      <DIR>          37cdb04027740
10/04/1999  12:56p      <DIR>          37e3eb1c62060
10/04/1999  12:51p      <DIR>          37e3ebcc27760
10/04/1999  12:45p      <DIR>          37ed151662060
10/04/1999  12:39p      <DIR>          37ed15dd27760
10/04/1999  11:33a      <DIR>          37f03ce962020
10/04/1999  11:21a      <DIR>          37f03cf7277c0
10/06/1999  05:38p      <DIR>          37fa7f00277e0
10/06/1999  05:46p      <DIR>          37fa7f01620a0

В этом примере путь поиска для файла символов acpi.dbg может выглядеть примерно так: \\mybuilds\symsrv\acpi.dbg\37cdb03962040.

Три файла могут существовать в каталоге подстановки:

  1. Если файл был сохранен, то acpi.dbg будет существовать там.
  2. Если указатель был сохранен, файл с именем file.ptr будет существовать и содержать путь к фактическому файлу символов.
  3. Файл с именем refs.ptr, содержащий список всех текущих расположений acpi.dbg с этим размером метки времени и изображения, которые в настоящее время добавляются в хранилище символов.

Отображение списка каталогов \\mybuilds\symsrv\acpi.dbg\37cdb03962040 дает следующее:

10/04/1999  01:54p                  52 file.ptr
10/04/1999  01:54p                  67 refs.ptr

Файл file.ptr содержит текстовую строку "\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg". Так как в этом каталоге нет файла acpi.dbg, отладчик попытается найти файл по адресу \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg.

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

0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg

В этом примере показано, что указатель на \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg добавлен с транзакцией "0000000026".

Некоторые файлы символов остаются постоянными через различные продукты или сборки или конкретный продукт. Одним из примеров этого является файл msvcrt.pdb. При выполнении каталога \\mybuilds\symsrv\msvcrt.pdb показано, что на сервер символов добавлены только две версии msvcrt.pdb:

Directory of \\mybuilds\symsrv\msvcrt.pdb
10/06/1999  05:37p      <DIR>          .
10/06/1999  05:37p      <DIR>          ..
10/04/1999  11:19a      <DIR>          37a8f40e2
10/06/1999  05:37p      <DIR>          37f2c2272

Однако при выполнении каталога \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 показано, что refs.ptr имеет несколько указателей в нем.

Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999  02:50p              54     file.ptr
10/05/1999  02:50p           2,039     refs.ptr

Содержимое \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr:

0000000001,ptr,\\mybuilds\symbols\x86\2137\symbols\dll\msvcrt.pdb
0000000002,ptr,\\mybuilds\symbols\x86\2137.chk\symbols\dll\msvcrt.pdb
0000000003,ptr,\\mybuilds\symbols\x86\2138\symbols\dll\msvcrt.pdb
0000000004,ptr,\\mybuilds\symbols\x86\2138.chk\symbols\dll\msvcrt.pdb
0000000005,ptr,\\mybuilds\symbols\x86\2139\symbols\dll\msvcrt.pdb
0000000006,ptr,\\mybuilds\symbols\x86\2139.chk\symbols\dll\msvcrt.pdb
0000000007,ptr,\\mybuilds\symbols\x86\2140\symbols\dll\msvcrt.pdb
0000000008,ptr,\\mybuilds\symbols\x86\2140.chk\symbols\dll\msvcrt.pdb
0000000009,ptr,\\mybuilds\symbols\x86\2136\symbols\dll\msvcrt.pdb
0000000010,ptr,\\mybuilds\symbols\x86\2136.chk\symbols\dll\msvcrt.pdb
0000000011,ptr,\\mybuilds\symbols\x86\2135\symbols\dll\msvcrt.pdb
0000000012,ptr,\\mybuilds\symbols\x86\2135.chk\symbols\dll\msvcrt.pdb
0000000013,ptr,\\mybuilds\symbols\x86\2134\symbols\dll\msvcrt.pdb
0000000014,ptr,\\mybuilds\symbols\x86\2134.chk\symbols\dll\msvcrt.pdb
0000000015,ptr,\\mybuilds\symbols\x86\2133\symbols\dll\msvcrt.pdb
0000000016,ptr,\\mybuilds\symbols\x86\2133.chk\symbols\dll\msvcrt.pdb
0000000017,ptr,\\mybuilds\symbols\x86\2132\symbols\dll\msvcrt.pdb
0000000018,ptr,\\mybuilds\symbols\x86\2132.chk\symbols\dll\msvcrt.pdb
0000000019,ptr,\\mybuilds\symbols\x86\2131\symbols\dll\msvcrt.pdb
0000000020,ptr,\\mybuilds\symbols\x86\2131.chk\symbols\dll\msvcrt.pdb
0000000021,ptr,\\mybuilds\symbols\x86\2130\symbols\dll\msvcrt.pdb
0000000022,ptr,\\mybuilds\symbols\x86\2130.chk\symbols\dll\msvcrt.pdb
0000000023,ptr,\\mybuilds\symbols\x86\2129\symbols\dll\msvcrt.pdb
0000000024,ptr,\\mybuilds\symbols\x86\2129.chk\symbols\dll\msvcrt.pdb
0000000025,ptr,\\mybuilds\symbols\x86\2128\symbols\dll\msvcrt.pdb
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\dll\msvcrt.pdb
0000000027,ptr,\\mybuilds\symbols\x86\2141\symbols\dll\msvcrt.pdb
0000000028,ptr,\\mybuilds\symbols\x86\2141.chk\symbols\dll\msvcrt.pdb
0000000029,ptr,\\mybuilds\symbols\x86\2142\symbols\dll\msvcrt.pdb
0000000030,ptr,\\mybuilds\symbols\x86\2142.chk\symbols\dll\msvcrt.pdb

В этом примере показано, что для нескольких сборок символов, хранящихся в \\mybuilds\symsrv, использовался тот же файл msvcrt.pdb.

Ниже приведен пример каталога, содержащего смесь добавлений файлов и указателей:

Directory of E:\symsrv\dbghelp.dbg\38039ff439000
10/12/1999  01:54p         141,232     dbghelp.dbg
10/13/1999  04:57p              49     file.ptr
10/13/1999  04:57p             306     refs.ptr

В этом случае refs.ptr содержит следующее содержимое:

0000000043,file,e:\binaries\symbols\retail\dll\dbghelp.dbg
0000000044,file,f:\binaries\symbols\retail\dll\dbghelp.dbg
0000000045,file,g:\binaries\symbols\retail\dll\dbghelp.dbg
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg

Таким образом, транзакции 43, 44 и 45 добавили тот же файл на сервер, а транзакции 46 и 47 добавлены указатели. Если транзакции 43, 44 и 45 удаляются, файл dbghelp.dbg будет удален из каталога. Затем каталог будет содержать следующее содержимое:

Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999  05:01p                   49 file.ptr
10/13/1999  05:01p                 130 refs.ptr

Теперь file.ptr содержит "\\sampledir2\bin\symbols\retail\dll\dbghelp.dbgg", а refs.ptr содержит

0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg

Когда последняя запись в refs.ptr является указателем, файл.ptr будет существовать и содержать путь к связанному файлу. Когда последняя запись в refs.ptr является файлом, файл.ptr не будет существовать в этом каталоге. Поэтому любая операция удаления, которая удаляет окончательную запись в refs.ptr, может привести к созданию, удалению или изменению file.ptr.