Ejemplos adicionales de DBH
Estos son ejemplos adicionales de comandos que se pueden emitir en el símbolo del sistema de DBH.
Mostrar símbolos privados y símbolos públicos
Si el destino es un archivo de símbolos completo, cada símbolo público aparece dos veces en el archivo: en la tabla de símbolos públicos y en los datos de símbolos privados. La copia de la tabla de símbolos públicos suele contener varias decoraciones (prefijos y sufijos). Para obtener más información, consulte Símbolos públicos y privados.
DBH puede mostrar información sobre este símbolo de los datos de símbolos privados, de la tabla de símbolos públicos sin decoraciones y de la tabla de símbolos públicos con decoraciones. Este es un ejemplo en el que se muestran los tres, con el agregador de comandos 414fe0 cada vez.
La primera vez que este comando aparece en este ejemplo, DBH usa las opciones de símbolo predeterminadas, por lo que la información resultante procede de los datos de símbolos privados. Tenga en cuenta que esta información incluye la dirección, el tamaño y el tipo de datos de la función fgets. A continuación, se usa el comando symopt +4000, que activa la opción SYMOPT_PUBLICS_ONLY. Esto hace que DBH ignore los datos de símbolos privados y, por lo tanto, cuando el comando addr 414fe0 se ejecuta la segunda vez, DBH usa la tabla de símbolos públicos y no se muestra información de tamaño o tipo de datos para los fgets de la función. Por último, se usa el comando symopt -2, desactivando la opción SYMOPT_UNDNAME y haciendo que DBH incluya decoraciones. Cuando el addr 414fe0 se ejecuta esta última vez, muestra la versión decorada del nombre de la función, _fgets.
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 113
flags : 0
type : 7e
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 7d
pid:4308 mod:TimeTest[400000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
pid:4308 mod:TimeTest[400000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
pid:4308 mod:TimeTest[400000]: addr 414fe0
_fgets
name : _fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
Si se hubiera usado la opción de línea de comandos -d, los resultados habrían mostrado el nombre público decorado desde el principio.
Determinar las decoraciones de un símbolo específico
DBH puede determinar las decoraciones en un símbolo específico. Esto puede ser útil cuando se usa junto con un programa que requiere que se especifiquen símbolos con sus decoraciones, como PDBCopy.
Por ejemplo, supongamos que el archivo de símbolos mysymbols.pdb contiene un símbolo cuyo nombre no descorrado es MyFunction1. Para buscar el nombre decorado, use el procedimiento siguiente.
En primer lugar, inicie DBH sin la opción de línea de comandos -d y, a continuación, use el comando symopt +4000 para que toda la información proceda de la tabla de símbolos públicos:
C:\> dbh c:\mydir\mysymbols.pdb
mysymbols [1000000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
A continuación, use el comando name o el comando enum para mostrar la dirección del símbolo deseado:
mysymbols [1000000]: enum myfunction1
index address name
2ab 102cb4e : MyFunction1
Ahora use symopt -2 para que las decoraciones de símbolos sean visibles y, a continuación, use el comando addr con la dirección de este símbolo:
mysymbols [1000000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
mysymbols [1000000]: addr 102cb4e
_MyFunction1@4
name : _InterlockedIncrement@4
addr : 102cb4e
size : 0
flags : 0
type : 0
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 2ab
Esto revela que el nombre decorado del símbolo es _MyFunction1@4.
Descodificación de decoraciones de símbolos
El comando undec se puede usar para mostrar el significado de las decoraciones de símbolos de C++. En el ejemplo siguiente, las decoraciones adjuntas a ?? _C@_03GGCAPAJC@Sep?$AA@ están descodificados para indicar que es una cadena:
dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@
??_C@_03GGCAPAJC@Sep?$AA@ =
`string'
Los ejemplos siguientes descodifican las decoraciones adjuntas a tres nombres de función, revelando sus prototipos:
dbh: undec ?gcontext@@3_KA
?gcontext@@3_KA =
unsigned __int64 gcontext
dbh: undec ?pathcpy@@YGXPAGPBG1K@Z
?pathcpy@@YGXPAGPBG1K@Z =
void __stdcall pathcpy(unsigned short *,unsigned short const *,unsigned short const *,unsigned long)
dbh: undec ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z =
int (__cdecl*__cdecl _set_new_handler(int (__cdecl*)(unsigned int)))(unsigned int)
El comando undec no muestra información sobre los caracteres de subrayado iniciales, el prefijo __imp_ o las decoraciones "@address" finales, que normalmente se encuentran adjuntas a nombres de función.
Puede usar el comando undec con cualquier cadena, no solo el nombre de un símbolo en el módulo cargado actualmente.
Ordenar una lista de símbolos por dirección
Si simplemente desea una lista de símbolos, ordenados en orden de dirección, puede ejecutar DBH en modo por lotes y canalizar los resultados a un comando de ordenación . Los valores de dirección normalmente comienzan en la 18ª columna de cada línea, por lo que el siguiente comando ordena los resultados por dirección:
dbh -p:4672 enum mymodule!* | sort /+18
Mostrar información de línea de origen
Cuando se usa un archivo de símbolos completo, DBH puede mostrar información de línea de origen. Esto no requiere acceso a ningún archivo de origen, ya que esta información se almacena en los propios archivos de símbolos.
Aquí, el comando de línea muestra la dirección hexadecimal de las instrucciones binarias correspondientes a la línea de origen especificada y muestra los símbolos asociados a esa línea. (En este ejemplo, no hay símbolos asociados a la línea).
dbh [1000000]: line myprogram.cpp#767
file : e:\mydirectory\src\myprogram.cpp
line : 767
addr : 1006191
key : 0000000000000000
disp : 0
Aquí, el comando srclines muestra los archivos de objeto asociados a la línea de origen especificada:
dbh [1000000]: srclines myprogram.cpp 767
0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp
Tenga en cuenta que la salida de srclines es similar a la del comando del depurador ln (List Nearest Symbols).
Mostrar un tipo de datos
El comando type se puede usar para mostrar información sobre un tipo de datos. Aquí se muestran datos sobre el tipo CMDPROC:
dbh [1000000]: type CMDPROC
name : CMDPROC
addr : 0
size : 8
flags : 0
type : c
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagTypedef (11)
index : c
El valor que aparece después de "tag" especifica la naturaleza de este tipo de datos. En este caso, SymTagTypedef indica que este tipo se definió mediante una instrucción typedef .
Usar símbolos imaginarios
El comando add puede agregar un símbolo imaginario al módulo cargado. El archivo de símbolos real no se modifica; solo se cambia la imagen de ese archivo en la memoria de DBH.
El comando add puede ser útil si desea invalidar temporalmente qué símbolos están asociados a un intervalo de direcciones determinado. En el ejemplo siguiente, una parte del intervalo de direcciones asociado a MyModule!main se reemplaza por el símbolo imaginario MyModule!magic.
Aquí se muestra cómo aparece el módulo antes de agregar el símbolo imaginario. Tenga en cuenta que la función principal comienza en 0x0042CC56 y tiene 0x42B de tamaño. Por lo tanto, cuando se usa el comando addr con la dirección 0x0042CD10, reconoce esta dirección como que se encuentra dentro de los límites de la función principal :
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
pid:6040 mod:MyModule[400000]: addr 42cc56
main
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
pid:6040 mod:MyModule[400000]: addr 42cd10
main+ba
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
Ahora, la magia de símbolos se agrega en la dirección 0x0042CD00, con el tamaño 0x10 bytes. Cuando se usa el comando enum , se establece el bit alto del índice, que muestra que se trata de un símbolo imaginario:
pid:6040 mod:MyModule[400000]: add magic 42cd00 10
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
80000001 42cd00 : magic
Cuando se usa el comando addr , busca los símbolos cuyos intervalos incluyen la dirección especificada. Dado que esta búsqueda comienza con la dirección especificada y se ejecuta hacia atrás, la dirección 0x004CD10 ahora está asociada a magic. Por otro lado, la dirección 0x004CD40 sigue asociada a main, porque se encuentra fuera del intervalo del símbolo mágico . Tenga en cuenta también que la etiqueta SymTagCustom indica un símbolo imaginario:
pid:6040 mod:MyModule[400000]: addr 42cd10
magic+10
name : magic
addr : 42cd00
size : 10
flags : 1000
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagCustom (1a)
index : 80000001
pid:6040 mod:MyModule[400000]: addr 42cd40
main+ea
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
Por último, el comando del puede eliminar la magia del símbolo, devolviendo todos los símbolos a sus intervalos originales:
pid:6040 mod:MyModule[400000]: del magic
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup