dt (Tipo de presentación)
El comando dt muestra información sobre una variable local, una variable global o un tipo de datos. Esto puede mostrar información sobre tipos de datos simples, así como estructuras y uniones.
Sintaxis de modo de usuario
dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
Sintaxis de modo kernel
[Processor] dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
Parámetros
Procesador
Especifica el procesador que ejecuta el proceso que contiene la información necesaria. Para obtener más información, vea Sintaxis de varios procesadores. Los procesadores solo se pueden especificar en modo kernel.
DisplayOpts
Especifica una o varias de las opciones dadas en la tabla siguiente. Estas opciones están precedidas por un guión.
Opción | Descripción |
---|---|
-a[quantity] |
Muestra cada elemento de matriz en una nueva línea, con su índice. Se mostrará un total de elementos de cantidad . No debe haber espacio entre la a y la cantidad. Si -a no va seguido de un dígito, se muestran todos los elementos de la matriz. El modificador -a[quantity] debe aparecer inmediatamente antes de cada nombre de tipo o nombre de campo que desee mostrar de esta manera. |
-b |
Mostrar bloques recursivamente. Si una estructura mostrada contiene subestructuras, se expande recursivamente a profundidades arbitrarias y se muestra en su totalidad. Los punteros solo se expanden si están en la estructura original, no en subestructuras. |
-c |
Salida compacta. Todos los campos se muestran en una línea, si es posible. (Cuando se usa con el modificador -a , cada elemento de matriz toma una línea en lugar de tener el formato de un bloque de varias líneas). |
-d |
Cuando se usa con un nombre que finaliza con un asterisco, muestre la salida detallada de todos los tipos que comienzan por Name. Si Name no termina con un asterisco, muestre la salida detallada. |
-e |
Fuerza dt a enumerar tipos. Esta opción solo es necesaria si dt interpreta erróneamente el valor name como una instancia en lugar de como un tipo. |
-i |
No escriba la sangría de los subtipos. |
-o |
Omita los valores de desplazamiento de los campos de estructura. |
-p |
La dirección es una dirección física, en lugar de una dirección virtual. |
-r[profundidad] |
Volca de forma recursiva los campos de subtipo. Si se da profundidad , esta recursividad se detendrá después de los niveles de profundidad . La profundidad debe ser un dígito entre 1 y 9, y no debe haber ningún espacio entre la r y la profundidad. El modificador -r[depth] debe aparecer inmediatamente antes de la dirección. |
-s size |
Enumera solo los tipos cuyo tamaño en bytes es igual al valor de size. La opción -s solo es útil cuando se enumeran los tipos. Cuando se especifica -s , -e siempre está implícito. |
-t |
Enumera solo los tipos. |
-v |
Salida detallada. Esto proporciona información adicional, como el tamaño total de una estructura y el número de sus elementos. Cuando se usa junto con la opción de búsqueda -y , se muestran todos los símbolos, incluso aquellos sin información de tipo asociada. |
SearchOpts
Especifica una o varias de las opciones dadas en la tabla siguiente. Estas opciones están precedidas por un guión.
Opción | Descripción |
---|---|
-n |
Esto indica que el siguiente parámetro es un nombre. Esto se debe usar si el elemento siguiente consta completamente de caracteres hexadecimales, ya que de lo contrario se tomará como una dirección. |
-y |
Esto indica que el siguiente parámetro es el principio del nombre, no necesariamente el nombre completo. Cuando se incluye -y , se muestran todas las coincidencias, seguidas de información detallada sobre la primera coincidencia de la lista. Si no se incluye -y , solo se mostrarán las coincidencias exactas. |
módulo
Parámetro opcional que especifica el módulo que define esta estructura. Si hay una variable local o un tipo con el mismo nombre que una variable global o un tipo, debe incluir el módulo para especificar que significa la variable global. De lo contrario, el comando dt mostrará la variable local, incluso si la variable local no distingue mayúsculas de minúsculas y la variable global es una coincidencia que distingue mayúsculas de minúsculas.
Nombre
Especifica el nombre de un tipo o una variable global. Si Name termina con un asterisco (*), se muestra una lista de todas las coincidencias. Por lo tanto, dt A\* enumerará todos los tipos de datos, globales y estáticos a partir de "A", pero no mostrará las instancias reales de estos tipos. (Si se usa la opción -v display al mismo tiempo, se mostrarán todos los símbolos, no solo los que tienen información de tipo asociado). También puede reemplazar Name por un punto (.) para indicar que desea repetir el valor usado más recientemente de Name.
Si Name contiene un espacio, debe ir entre paréntesis.
Campo
Especifica los campos que se van a mostrar. Si se omite Field , se muestran todos los campos. Si Field va seguido de un punto (.), también se mostrarán los subcampos de primer nivel de este campo. Si field se sigue con una serie de puntos, los subcampos se mostrarán a una profundidad igual al número de períodos. Cualquier nombre de campo seguido de un punto se tratará como una coincidencia de prefijo, como si se usara la opción de búsqueda -y . Si field va seguido de un asterisco (*), se trata como solo el principio del campo, no necesariamente el campo completo y se muestran todos los campos coincidentes.
Dirección
Especifica la dirección de la estructura que se va a mostrar. Si se omite Name , se debe incluir Address y debe especificar la dirección de una variable global. Se toma la dirección para que sea una dirección virtual a menos que se especifique lo contrario. Use la opción -p para especificar una dirección física. Use un signo "at" ( @ ) para especificar un registro (por ejemplo, @eax).
Lista
Especifica el nombre de campo que vincula una lista vinculada. El parámetro Address debe incluirse.
Entorno
Elemento | Descripción |
---|---|
Modos | Modo de usuario, modo kernel |
Destinos | En tiempo real, volcado de errores |
Platforms | All |
Información adicional
Para obtener información general sobre la manipulación de memoria y una descripción de otros comandos relacionados con la memoria, consulte Lectura y escritura de memoria.
Comentarios
La salida del comando dt siempre mostrará números con signo en base 10 y números sin signo en hexadecimal.
Todos los parámetros de dt que permiten valores de símbolos también permiten caracteres comodín de cadena. Consulte Sintaxis de caracteres comodín de cadena para obtener más información.
Las opciones -y y y -n pueden preceder a cualquier nombre o campo. La opción -y permite especificar el principio del tipo o el nombre de la estructura. Por ejemplo, dt -y ALLEN mostrará datos sobre el tipo ALLENTOWN. Sin embargo, no se pudo mostrar el tipo ALLENTOWN con dt -y A. En su lugar, tendría que usar dt -ny A, porque A es un valor hexadecimal válido y se interpretaría como una dirección sin la opción -n .
Si Name indica una estructura, se mostrarán todos los campos (por ejemplo, dt myStruct). Si solo desea un campo específico, puede realizar dt myStruct myField. Esto muestra el miembro al que C llamaría a myStruct.myField. Sin embargo, tenga en cuenta que el comando dt myStruct myField1 myField2 muestra myStruct.myField1 y myStruct.myField2. No muestra myStruct.myField1.myField2.
Si un nombre de estructura o campo va seguido de un subíndice, especifica una sola instancia de una matriz. Por ejemplo, dt myStruct myFieldArray[3] mostrará el cuarto elemento de la matriz en cuestión. Pero si un nombre de tipo va seguido de un subíndice, especifica una matriz completa. Por ejemplo, dt CHAR[8] myPtr mostrará una cadena de ocho caracteres. El subíndice siempre se toma como decimal independientemente del radix actual; Un prefijo 0x provocará un error.
Dado que el comando usa información de tipo de .pdb , se puede usar libremente para depurar cualquier plataforma de CPU.
La información de tipo usada por dt incluye todos los nombres de tipo creados con typedef, incluidos todos los tipos definidos por Windows. Por ejemplo, long sin signo y char no son nombres de tipo válidos, pero ULONG y CHAR son. Consulte Microsoft Windows SDK para obtener una lista completa de todos los nombres de tipo de Windows.
Todos los tipos creados por definiciones de tipo dentro de su propio código estarán presentes, siempre y cuando se hayan usado realmente en el programa. Sin embargo, los tipos definidos en los encabezados, pero que nunca se usan realmente no se almacenarán en los archivos de símbolos .pdb y no serán accesibles para el depurador. Para que este tipo esté disponible para el depurador, úselo como entrada de una instrucción typedef. Por ejemplo, si aparece lo siguiente en el código, la estructura MY_DATA se almacenará en el archivo de símbolos .pdb y el comando dt puede mostrarlo:
typedef struct _MY_DATA {
. . .
} MY_DATA;
typedef MY_DATA *PMY_DATA;
Por otro lado, el código siguiente no bastaría porque tanto MY_DATA como PMY_DATA se definen mediante la definición de tipo inicial y, por lo tanto, MY_DATA no se ha usado como entrada de ninguna instrucción typedef:
typedef struct _MY_DATA {
. . .
} MY_DATA, *PMY_DATA;
En cualquier caso, la información de tipo solo se incluye en un archivo de símbolos completo, no en un archivo de símbolos que se ha quitado de toda la información de símbolos privados. Para obtener más información, consulte Símbolos públicos y privados.
Si desea mostrar cadenas unicode, primero debe usar el comando .enable_unicode (Habilitar presentación Unicode). Puede controlar la visualización de enteros largos con el comando .enable_long_status (Habilitar visualización de enteros largos).
En el ejemplo siguiente, dt muestra una variable global:
0:000> dt mt1
+0x000 a : 10
+0x004 b : 98 'b'
+0x006 c : 0xdd
+0x008 d : 0xabcd
+0x00c gn : [6] 0x1
+0x024 ex : 0x0
En el ejemplo siguiente, dt muestra el campo de matriz gn:
0:000> dt mt1 -a gn
+0x00c gn :
[00] 0x1
[01] 0x2
[02] 0x3
[03] 0x4
[04] 0x5
[05] 0x6
El siguiente comando muestra algunos subcampos de una variable:
0:000> dt mcl1 m_t1 dpo
+0x010 dpo : DEEP_ONE
+0x070 m_t1 : MYTYPE1
El comando siguiente muestra los subcampos del campo m_t1. Dado que el período provoca automáticamente la coincidencia de prefijos, también mostrará subcampos de cualquier campo que comience por "m_t1":
0:000> dt mcl1 m_t1.
+0x070 m_t1 :
+0x000 a : 0
+0x004 b : 0 '
+0x006 c : 0x0
+0x008 d : 0x0
+0x00c gn : [6] 0x0
+0x024 ex : 0x0
Podría repetir esto en cualquier profundidad. Por ejemplo, el comando dt mcl1 a.. c. mostraría todos los campos a la profundidad cuatro, de modo que el nombre del primer campo comenzó con un y el tercer nombre de campo comenzó con c.
Este es un ejemplo más detallado de cómo se pueden mostrar los subcampos. En primer lugar, muestre el campo Ldr :
0:000> dt nt!_PEB Ldr 7ffdf000
+0x00c Ldr : 0x00191ea0
Ahora expanda el campo de tipo de puntero:
0:000> dt nt!_PEB Ldr Ldr. 7ffdf000
+0x00c Ldr : 0x00191ea0
+0x000 Length : 0x28
+0x004 Initialized : 0x1 '
+0x008 SsHandle : (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x191ee0 - 0x192848 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x191ee8 - 0x192850 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x191f58 - 0x192858 ]
+0x024 EntryInProgress : (null)
Ahora muestra el campo CriticalSectionTimeout :
0:000> dt nt!_PEB CriticalSectionTimeout 7ffdf000
+0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
Ahora expanda los subcampos de estructura CriticalSectionTimeout en un nivel profundo:
0:000> dt nt!_PEB CriticalSectionTimeout. 7ffdf000
+0x070 CriticalSectionTimeout : 0xffffe86d`079b8000
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 u : __unnamed
+0x000 QuadPart : -25920000000000
Ahora expanda los subcampos de estructura CriticalSectionTimeout en dos niveles:
0:000> dt nt!_PEB CriticalSectionTimeout.. 7ffdf000
+0x070 CriticalSectionTimeout : 0xffffe86d`079b8000
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 u :
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 QuadPart : -25920000000000
El comando siguiente muestra una instancia del tipo de datos MYTYPE1 que se encuentra en la dirección 0x0100297C:
0:000> dt 0x0100297c MYTYPE1
+0x000 a : 22
+0x004 b : 43 '+'
+0x006 c : 0x0
+0x008 d : 0x0
+0x00c gn : [6] 0x0
+0x024 ex : 0x0
El comando siguiente muestra una matriz de 10 ULONG en la dirección 0x01002BE0:
0:000> dt -ca10 ULONG 01002be0
[0] 0x1001098
[1] 0x1
[2] 0xdead
[3] 0x7d0
[4] 0x1
[5] 0xcd
[6] 0x0
[7] 0x0
[8] 0x0
[9] 0x0
El siguiente comando continúa la presentación anterior en una dirección diferente. Tenga en cuenta que no es necesario volver a escribir "ULONG":
0:000> dt -ca4 . 01002d00
Using sym ULONG
[0] 0x12
[1] 0x4ac
[2] 0xbadfeed
[3] 0x2
Estos son algunos ejemplos de presentación de tipos. El siguiente comando muestra todos los tipos y globales que comienzan con la cadena "MY" en el módulo thismodule. Los prefijos con una dirección son instancias reales; aquellos sin direcciones son definiciones de tipo:
0:000> dt thismodule!MY*
010029b8 thismodule!myglobal1
01002990 thismodule!myglobal2
thismodule!MYCLASS1
thismodule!MYCLASS2
thismodule!MYCLASS3
thismodule!MYTYPE3::u
thismodule!MYTYPE1
thismodule!MYTYPE3
thismodule!MYTYPE3
thismodule!MYFLAGS
Al realizar la presentación de tipos, se puede usar la opción -v para mostrar el tamaño de cada elemento. La opción de tamaño -s se puede usar para enumerar solo elementos de un tamaño específico. De nuevo, los prefijos con una dirección son instancias reales; aquellos sin direcciones son definiciones de tipo:
0:001> dt -s 2 -v thismodule!*
Enumerating symbols matching thismodule!*, Size = 0x2
Address Size Symbol
002 thismodule!wchar_t
002 thismodule!WORD
002 thismodule!USHORT
002 thismodule!SHORT
002 thismodule!u_short
002 thismodule!WCHAR
00427a34 002 thismodule!numberOfShips
00427a32 002 thismodule!numberOfPlanes
00427a30 002 thismodule!totalNumberOfItems
Este es un ejemplo de la opción -b . La estructura se expande y la matriz OwnerThreads dentro de la estructura se expande, pero no se siguen los punteros de lista Flink y Blink:
kd> dt nt!_ERESOURCE -b 0x8154f040
+0x000 SystemResourcesList : [ 0x815bb388 - 0x816cd478 ]
+0x000 Flink : 0x815bb388
+0x004 Blink : 0x816cd478
+0x008 OwnerTable : (null)
+0x00c ActiveCount : 1
+0x00e Flag : 8
+0x010 SharedWaiters : (null)
+0x014 ExclusiveWaiters : (null)
+0x018 OwnerThreads :
[00]
+0x000 OwnerThread : 0
+0x004 OwnerCount : 0
+0x004 TableSize : 0
[01]
+0x000 OwnerThread : 0x8167f563
+0x004 OwnerCount : 1
+0x004 TableSize : 1
+0x028 ContentionCount : 0
+0x02c NumberOfSharedWaiters : 0
+0x02e NumberOfExclusiveWaiters : 0
+0x030 Address : (null)
+0x030 CreatorBackTraceIndex : 0
+0x034 SpinLock : 0
Este es un ejemplo de dt en modo kernel. El comando siguiente genera resultados similares a !process 0 0:
kd> dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni 814856f0
## ActiveProcessLinks.Flink at 0x814856f0
UniqueProcessId : 0x00000008
ImageFileName : [16] "System"
## ActiveProcessLinks.Flink at 0x8138a030
UniqueProcessId : 0x00000084
ImageFileName : [16] "smss.exe"
## ActiveProcessLinks.Flink at 0x81372368
UniqueProcessId : 0x000000a0
ImageFileName : [16] "csrss.exe"
## ActiveProcessLinks.Flink at 0x81369930
UniqueProcessId : 0x000000b4
ImageFileName : [16] "winlogon.exe"
....
Si desea ejecutar un comando para cada elemento de la lista, use la extensión !list .
Por último, el comando dt -h mostrará un texto de ayuda breve que resume la sintaxis dt .