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


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

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

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

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".

Некоторые файлы символов остаются постоянными в различных продуктах, сборках или определенном продукте. Одним из примеров этого является файл Windows 2000 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

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

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

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,\\MyDir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\foo2\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

Теперь файл.ptr содержит "\\foo2\bin\symbols\retail\dll\dbghelp.dbg", а refs.ptr содержит

0000000046,ptr,\\MyDir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\foo2\bin\symbols\retail\dll\dbghelp.dbg

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