Compartir a través de


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