Uso de alias
Los alias son cadenas de caracteres que se reemplazan automáticamente por otras cadenas de caracteres. Puede usarlos en comandos del depurador y evitar volver a establecer determinadas frases comunes.
Un alias consta de un nombre de alias y un alias equivalente. Cuando se usa un nombre de alias como parte de un comando del depurador, el nombre se reemplaza automáticamente por el alias equivalente. Este reemplazo se produce inmediatamente, antes de analizar o ejecutar el comando.
El depurador admite tres tipos de alias:
Puede establecer y asignar nombres a alias con nombre de usuario.
Puede establecer alias de nombre fijo, pero se denominan $u 0, $u 1, ..., $u 9.
El depurador establece y asigna nombres a alias automáticos.
Definición de un alias de User-Named
Al definir un alias con nombre de usuario, puede elegir el nombre del alias y el alias equivalente:
El nombre del alias puede ser cualquier cadena que no contenga espacios en blanco.
El alias equivalente puede ser cualquier cadena. Si lo escribe en el teclado, el alias equivalente no puede contener espacios iniciales o devoluciones de carro. Como alternativa, puede establecerlo igual a una cadena en memoria, el valor de una expresión numérica, el contenido de un archivo, el valor de una variable de entorno o la salida de uno o varios comandos del depurador.
Tanto el nombre del alias como el equivalente del alias distinguen mayúsculas de minúsculas.
Para definir o redefinir un alias con nombre de usuario, use el comando as (Establecer alias) o aS (Establecer alias).
Para quitar un alias, use el comando ad (Eliminar alias).
Para enumerar todos los alias con nombre de usuario actuales, use el comando al (Alias de lista).
Definición de un alias de Fixed-Name
Hay 10 alias de nombre fijo. Sus nombres de alias son $u 0, $u 1, ..., $u 9. Sus equivalentes de alias pueden ser cualquier cadena que no contenga la pulsación de tecla ENTRAR.
Use el comando r (Registers) para definir los equivalentes de alias para alias de nombre fijo. Al definir un alias de nombre fijo, debe insertar un punto (.) antes de la letra "u". El texto después del signo igual (=) es el alias equivalente. El alias equivalente puede incluir espacios o punto y coma, pero se omiten los espacios iniciales y finales. No debe incluir el alias equivalente entre comillas (a menos que desee comillas en los resultados).
Nota No se confunda mediante el comando r (Registers) para alias de nombre fijo. Estos alias no son registros ni pseudo-registros, aunque use el comando r para establecer sus equivalentes de alias. No es necesario agregar un signo en (@) antes de estos alias y no puede usar el comando r para mostrar el valor de uno de estos alias.
De forma predeterminada, si no define un alias de nombre fijo, es una cadena vacía.
Alias automáticos
El depurador establece los siguientes alias automáticos.
Nombre de alias | Alias equivalente |
---|---|
$ntnsym |
Módulo más adecuado para símbolos NT en la arquitectura nativa del equipo. Este alias puede ser igual a ntdll o nt. |
$ntwsym |
El módulo más adecuado para los símbolos NT durante la depuración de 32 bits que usa WOW64. Este alias podría ser ntdll32 o alguna otra versión de 32 bits de Ntdll.dll. |
$ntsym |
Módulo más adecuado para símbolos NT que coinciden con el modo de máquina actual. Al depurar en modo nativo, este alias es el mismo que $ntnsym. Cuando se depura en un modo no nativo, el depurador intenta encontrar un módulo que coincida con este modo. (Por ejemplo, durante la depuración de 32 bits que usa WOW64, este alias es el mismo que $ntwsym). |
$CurrentDumpFile |
Nombre del último archivo de volcado que cargó el depurador. |
$CurrentDumpPath |
Ruta de acceso del directorio del último archivo de volcado que cargó el depurador. |
$CurrentDumpArchiveFile |
Nombre del último archivo de archivo de volcado (archivo CAB) que cargó el depurador. |
$CurrentDumpArchivePath |
Ruta de acceso del directorio del último archivo de volcado de memoria (archivo CAB) que cargó el depurador. |
Los alias automáticos son similares a los pseudo-registros automáticos, salvo que puede usar alias automáticos con tokens relacionados con alias (como ${ }), mientras que no se pueden usar pseudo-registros con estos tokens.
Usar un alias en la ventana Comando del depurador
Después de definir un alias, puede usarlo en cualquier entrada de comando. El nombre del alias se reemplaza automáticamente por el alias equivalente. Por lo tanto, puede usar el alias como una expresión o como una macro.
Un nombre de alias se expande correctamente incluso si está entre comillas. Dado que el alias equivalente puede incluir cualquier número de comillas o punto y coma, el alias equivalente puede representar varios comandos.
Solo se reconoce un alias con nombre de usuario si su nombre está separado de otros caracteres por espacio en blanco. El primer carácter de su nombre de alias debe comenzar la línea o seguir un espacio, un punto y coma o una comilla. El último carácter de su nombre de alias debe finalizar la línea o estar seguida de un espacio, un punto y coma o una comilla.
Nota Cualquier texto que escriba en la ventana Comando del depurador que comience por "as", "aS", "aD" o "al" no recibirá reemplazo de alias. Esta restricción impide que los comandos de alias se represente inoperable. Sin embargo, esta restricción también significa que los comandos que siguen a ad o al en una línea no tienen sus alias reemplazados. Si desea que los alias se reemplacen en una línea que comience por una de estas cadenas, agregue un punto y coma antes del alias.
Sin embargo, puede usar el token ${ } para expandir un alias con nombre de usuario incluso cuando está junto a otro texto. También puede usar este token junto con determinados modificadores para evitar que se expanda un alias o para mostrar determinados valores relacionados con alias. Para obtener más información sobre estas situaciones, vea ${ } (Intérprete de alias).
Un alias de nombre fijo se expande correctamente desde cualquier punto dentro de una línea, independientemente de cómo se inserte dentro del texto de la línea.
No puede usar comandos que solo estén disponibles en WinDbg (.open, .write_cmd_hist (Write Command History), .lsrcpath y .lsrcfix) y algunos comandos adicionales (.hh, .cls, .wtitle, .remote, kernel-mode .restart y user-mode .restart) con alias.
Usar un alias en un archivo de script
Al usar un alias en un archivo de script, debe tener especial cuidado para asegurarse de que el alias se expanda en el momento correcto. Tenga en cuenta el siguiente script:
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
La primera vez a través del bucle, el comando as, aS (Establecer alias) asigna un valor a myAlias. El valor asignado a myAlias es 1 más 610000 (la primera salida del comando dd). Sin embargo, cuando se ejecuta el comando .echo (Echo Comment), myAlias aún no se ha expandido, por lo que en lugar de ver 610001, vemos el texto "myAlias".
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
El problema es que myAlias no se expande hasta que se escribe un nuevo bloque de código. La siguiente entrada al bucle es un nuevo bloque, por lo que myAlias se expande a 610001. Pero es demasiado tarde: deberíamos haber visto 610001 la primera vez a través del bucle, no la segunda vez. Podemos corregir este problema mediante la inclusión del comando .echo (Echo Comment) en un nuevo bloque, como se muestra en el siguiente script.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.block{.echo value myAlias}
}
ad myAlias
Con el script modificado, obtenemos la siguiente salida correcta.
0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000
Para obtener más información, vea .block y ${ } (Intérprete de alias).
Uso de un token .foreach en un alias
Al usar un token .foreach en la definición de un alias, debe tener especial cuidado para asegurarse de que el token se expanda. Tenga en cuenta la siguiente secuencia de comandos.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al
El primer comando establece el valor del pseudo-registro de $t 0 en 5. El segundo comando elimina cualquier valor que se haya asignado previamente a myAlias. El tercer comando toma el tercer token del comando ?@$t 0 e intenta asignar el valor de ese token a myAlias. El cuarto comando enumera todos los alias y sus valores. Esperamos que el valor de myAlias sea 5, pero en su lugar el valor es la palabra "Token".
Alias Value
------- -------
myAlias Token
El problema es que el comando as está al principio de la línea en el cuerpo del bucle .foreach . Cuando una línea comienza con un comando as , los alias y los tokens de esa línea no se expanden. Si colocamos un espacio de punto y coma o en blanco delante del comando as , se expande cualquier alias o token que ya tenga un valor. En este ejemplo, myAlias no se expande porque aún no tiene un valor. El token se expande porque tiene un valor de 5. Esta es la misma secuencia de comandos con la adición de un punto y coma antes del comando as .
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al
Ahora obtenemos la salida esperada.
Alias Value
------- -------
myAlias 5
Alias recursivos
Puede usar un alias de nombre fijo en la definición de cualquier alias. También puede usar un alias con nombre de usuario en la definición de un alias de nombre fijo. Sin embargo, para usar un alias con nombre de usuario en la definición de otro alias con nombre de usuario, debe agregar un punto y coma antes del comando as o aS , o bien, el reemplazo de alias no se produce en esa línea.
Cuando se usan definiciones recursivas de este tipo, cada alias se traduce en cuanto se usa. Por ejemplo, en el ejemplo siguiente se muestra 3, no 7.
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
Del mismo modo, en el ejemplo siguiente se muestran 3, no 7.
0:000> as fred 2
0:000> r $.u1= 1 + fred
0:000> as fred 6
0:000> ? $u1
Evaluate expression: 3 = 00000003
El ejemplo siguiente también se permite y muestra 9.
0:000> r $.u0=2
0:000> r $.u0=7+$u0
0:000> ? $u0
Evaluate expression: 9 = 00000009
Ejemplos de alias
Puede usar alias para que no tenga que escribir nombres de símbolos largos o complejos, como en el ejemplo siguiente.
0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8
El ejemplo siguiente es similar al ejemplo anterior, pero usa un alias de nombre fijo.
0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8
Puede usar alias como macros para los comandos que se usan con frecuencia. En el ejemplo siguiente se incrementan los registros eax y ebx dos veces.
0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp
En el ejemplo siguiente se usa un alias para simplificar la escritura de comandos.
0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd
El ejemplo siguiente es similar al ejemplo anterior, pero usa un alias de nombre fijo.
0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5
Ambos ejemplos anteriores son equivalentes al siguiente comando.
0:000> bp MyApi "dd esp 14; g"
archivo de Tools.ini
En CDB (y NTSD), puede predefinir alias de nombre fijo en el archivo tools.ini . Para predefinir un alias de nombre fijo, agregue los campos $u que desea a la entrada [NTSD], como en el ejemplo siguiente.
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
No se pueden establecer alias con nombre de usuario en el archivo Tools.ini.
alias de Fixed-Name frente a alias de User-Named
Los alias de nombre de usuario son más fáciles de usar que los alias con nombre fijo. Su sintaxis de definición es más sencilla y puede enumerarlas mediante el comando al (Alias de lista).
Los alias con nombre fijo se reemplazan si se usan junto a otro texto. Para que un alias con nombre de usuario se reemplace cuando esté junto a otro texto, escríbalo en el token ${ } (intérprete de alias ).
El reemplazo de alias de nombre fijo se produce antes de reemplazar alias con nombre de usuario.