Uso de SymStore
SymStore (symstore.exe) es una herramienta para crear almacenes de símbolos. Se incluye en el paquete Herramientas de depuración para Windows .
SymStore almacena símbolos en un formato que permite al depurador buscar los símbolos en función de la marca de tiempo y el tamaño de la imagen (para un archivo .dbg o ejecutable), o firma y antigüedad (para un archivo .pdb). La ventaja del almacén de símbolos sobre el formato de almacenamiento de símbolos tradicional es que todos los símbolos se pueden almacenar o hacer referencia a ellos en el mismo servidor y recuperados por el depurador sin ningún conocimiento previo de qué producto contiene el símbolo correspondiente.
Tenga en cuenta que no se pueden almacenar varias versiones de archivos de símbolos .pdb (por ejemplo, versiones públicas y privadas) en el mismo servidor, ya que cada una contiene la misma firma y antigüedad.
Transacciones de SymStore
Cada llamada a SymStore se registra como una transacción. Hay dos tipos de transacciones: agregar y eliminar.
Cuando se crea el almacén de símbolos, se crea un directorio denominado "000admin" en la raíz del servidor. El directorio 000admin contiene un archivo para cada transacción, así como los archivos de registro Server.txt y History.txt. El archivo Server.txt contiene una lista de todas las transacciones que están actualmente en el servidor. El archivo History.txt contiene un historial cronológico de todas las transacciones.
Cada vez que SymStore almacena o quita los archivos de símbolos, se crea un nuevo número de transacción. A continuación, se crea un archivo, cuyo nombre es este número de transacción, en 000admin. Este archivo contiene una lista de todos los archivos o punteros que se han agregado al almacén de símbolos durante esta transacción. Si se elimina una transacción, SymStore leerá a través de su archivo de transacción para determinar qué archivos y punteros debe eliminar.
Las opciones add y del especifican si se va a realizar una transacción de adición o eliminación. Incluir la opción /p con una operación de adición especifica que se va a agregar un puntero; si se omite la opción /p , se especifica que se va a agregar el archivo de símbolos real.
También es posible crear el almacén de símbolos en dos fases independientes. En la primera fase, se usa SymStore con la opción /x para crear un archivo de índice. En la segunda fase, se usa SymStore con la opción /y para crear el almacén real de archivos o punteros a partir de la información del archivo de índice.
Puede ser una técnica útil por diversos motivos. Por ejemplo, esto permite volver a crear fácilmente el almacén de símbolos si el almacén se pierde de alguna manera, siempre y cuando el archivo de índice siga existiendo. O quizás el equipo que contiene los archivos de símbolos tiene una conexión de red lenta al equipo en el que se creará el almacén de símbolos. En este caso, puede crear el archivo de índice en la misma máquina que los archivos de símbolos, transferir el archivo de índice a la segunda máquina y, a continuación, crear el almacén en la segunda máquina.
Para obtener una lista completa de todos los parámetros de SymStore, consulte SymStore Command-Line Options.
Nota:
SymStore no admite transacciones simultáneas de varios usuarios. Se recomienda que un usuario se designe como "administrador" del almacén de símbolos y sea responsable de todas las transacciones add y del .
Ejemplos de transacciones
Estos son dos ejemplos de SymStore que agregan punteros de símbolo para la compilación 3790 de Windows Server 2003 a \\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"
En el ejemplo siguiente, SymStore agrega los archivos de símbolos reales para un proyecto de aplicación en \\largeapp\appserver\bins a \\testdir\symsrv:
symstore add /r /f \\largeapp\appserver\bins\*.* /s \\testdir\symsrv
/t "Large Application" /v "Build 432" /c "Sample add"
Este es un ejemplo de cómo se usa un archivo de índice. En primer lugar, SymStore crea un archivo de índice basado en la colección de archivos de símbolos en \\largeapp\appserver\bins\. En este caso, el archivo de índice se coloca en un tercer equipo, \\hubserver\hubshare. Use la opción /g para especificar que el prefijo de archivo "\\largeapp\appserver" podría cambiar en el futuro:
symstore add /r /p /g \\largeapp\appserver /f
\\largeapp\appserver\bins\*.*
/x \\hubserver\hubshare\myindex.txt
Ahora supongamos que mueve todos los archivos de símbolos fuera de la máquina \\largeapp\appserver y los coloca en \\myarchive\appserver. A continuación, puede crear el propio almacén de símbolos desde el archivo de índice \\hubserver\hubshare\myindex.txt de la siguiente manera:
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"
Por último, este es un ejemplo de SymStore que elimina un archivo agregado por una transacción anterior. Consulte la sección siguiente para obtener una explicación de cómo determinar el identificador de transacción (en este caso, 0000000096).
symstore del /i 0000000096 /s \\sampledir\symsrv
Archivos comprimidos
SymStore se puede usar con archivos comprimidos de dos maneras diferentes.
- Use SymStore con la opción /p para almacenar punteros a los archivos de símbolos. Una vez finalizado SymStore, comprima los archivos a los que hacen referencia los punteros.
- Use SymStore con la opción /x para crear un archivo de índice. Una vez finalizado SymStore, comprima los archivos enumerados en el archivo de índice. A continuación, use SymStore con la opción /y (y, si lo desea, la opción /p ) para almacenar los archivos o punteros a los archivos del almacén de símbolos. (SymStore no tendrá que descomprimir los archivos para realizar esta operación).
El servidor de símbolos será responsable de descomprimir los archivos cuando sean necesarios.
Si usa SymSrv como servidor de símbolos, cualquier compresión debe realizarse con la herramienta compress.exe que se distribuye con el Kit de desarrollo de software (SDK) de Microsoft Windows. Los archivos comprimidos deben tener un carácter de subrayado como último carácter en sus extensiones de archivo (por ejemplo, module1.pd_ o module2.db_). Para obtener más información, consulte Uso de SymSrv.
Archivos de server.txt y history.txt
Cuando se agrega una transacción, se agregan varios elementos de información a server.txt y history.txt para la funcionalidad de búsqueda futura. A continuación se muestra un ejemplo de una línea en server.txt y history.txt para una transacción de adición:
0000000096,add,ptr,10/09/99,00:08:32,Windows XP,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,
Se trata de una línea separada por comas. Los campos se definen de la siguiente manera.
Campo | Descripción |
---|---|
0000000096 | Número de id. de transacción, creado por SymStore. |
agregar | Tipo de transacción. Este campo puede ser agregar o del. |
ptr | Si se agregaron archivos o punteros. Este campo puede ser file o ptr. |
10/09/99 | Fecha en que se produjo la transacción. |
00:08:32 | Hora en que se inició la transacción. |
Windows XP | Producto. |
x86 fre | Versión (opcional). |
Se ha agregado desde | Comentario (opcional) |
No utilizado | (Reservado para su uso posterior). |
Estas son algunas líneas de ejemplo del archivo de transacción 0000000096. Cada línea registra el directorio y la ubicación del archivo o puntero que se agregó al directorio.
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
Si usa una transacción del para deshacer las transacciones de adición originales, estas líneas se quitarán de server.txt y se agregará la línea siguiente a history.txt:
0000000105,del,0000000096
Los campos de la transacción de eliminación se definen de la siguiente manera.
Campo | Descripción |
---|---|
0000000105 | Número de id. de transacción, creado por SymStore. |
del | Tipo de transacción. Este campo puede ser agregar o del. |
0000000096 | Transacción que se eliminó. |
Formato de almacenamiento de símbolos
SymStore usa el propio sistema de archivos como base de datos. Crea un árbol grande de directorios, con nombres de directorio basados en elementos como las marcas de tiempo del archivo de símbolos, las firmas, la antigüedad y otros datos.
Por ejemplo, después de agregar varios archivos acpi.dbg diferentes al servidor, los directorios podrían tener este aspecto:
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
En este ejemplo, la ruta de acceso de búsqueda del archivo de símbolo acpi.dbg podría tener un aspecto similar al siguiente: \\mybuilds\symsrv\acpi.dbg\37cdb03962040.
Es posible que existan tres archivos dentro del directorio de búsqueda:
- Si el archivo se almacenó, acpi.dbg existirá allí.
- Si se almacenó un puntero, existirá un archivo denominado file.ptr y contendrá la ruta de acceso al archivo de símbolos real.
- Un archivo denominado refs.ptr, que contiene una lista de todas las ubicaciones actuales de acpi.dbg con esta marca de tiempo y tamaño de imagen que se agregan actualmente al almacén de símbolos.
Mostrar la lista de directorios de \\mybuilds\symsrv\acpi.dbg\37cdb03962040 proporciona lo siguiente:
10/04/1999 01:54p 52 file.ptr
10/04/1999 01:54p 67 refs.ptr
El archivo file.ptr contiene la cadena de texto "\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg". Dado que no hay ningún archivo llamado acpi.dbg en este directorio, el depurador intentará encontrar el archivo en \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg.
SymStore solo usa el contenido de refs.ptr, no el depurador. Este archivo contiene un registro de todas las transacciones que se han realizado en este directorio. Una línea de ejemplo de refs.ptr podría ser:
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg
Esto muestra que se agregó un puntero a \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg con la transacción "0000000026".
Algunos archivos de símbolos permanecen constantes a través de varios productos o compilaciones o un producto determinado. Un ejemplo de esto es el archivo msvcrt.pdb. Al realizar un directorio de \\mybuilds\symsrv\msvcrt.pdb se muestra que solo se han agregado dos versiones de msvcrt.pdb al servidor de símbolos:
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
Sin embargo, al realizar un directorio de \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 se muestra que refs.ptr tiene varios punteros en él.
Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999 02:50p 54 file.ptr
10/05/1999 02:50p 2,039 refs.ptr
El contenido de \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr son los siguientes:
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
Esto muestra que se usó el mismo msvcrt.pdb para varias compilaciones de símbolos almacenados en \\mybuilds\symsrv.
Este es un ejemplo de un directorio que contiene una combinación de adiciones de archivo y puntero:
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
En este caso, refs.ptr tiene el siguiente contenido:
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
Por lo tanto, las transacciones 43, 44 y 45 agregaron el mismo archivo al servidor, y las transacciones 46 y 47 agregaron punteros. Si se eliminan las transacciones 43, 44 y 45, el archivo dbghelp.dbg se eliminará del directorio. A continuación, el directorio tendrá el siguiente contenido:
Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999 05:01p 49 file.ptr
10/13/1999 05:01p 130 refs.ptr
Ahora file.ptr contiene "\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg" y refs.ptr contiene
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg
Cada vez que la entrada final en refs.ptr es un puntero, el archivo file.ptr existirá y contendrá la ruta de acceso al archivo asociado. Cada vez que la entrada final en refs.ptr es un archivo, no existirá file.ptr en este directorio. Por lo tanto, cualquier operación de eliminación que quite la entrada final en refs.ptr puede dar lugar a que file.ptr se cree, elimine o cambie.