Utilisation d’alias
Les alias sont des chaînes de caractères qui sont automatiquement remplacées par d’autres chaînes de caractères. Vous pouvez les utiliser dans les commandes du débogueur et éviter de retaper certaines expressions courantes.
Un alias se compose d’un nom d’alias et d’un alias équivalent. Lorsque vous utilisez un nom d’alias dans le cadre d’une commande de débogueur, le nom est automatiquement remplacé par l’alias équivalent. Ce remplacement se produit immédiatement, avant l’analyse ou l’exécution de la commande.
Le débogueur prend en charge trois types d’alias :
Vous pouvez définir et nommer des alias nommés par l’utilisateur.
Vous pouvez définir des alias à nom fixe, mais ils sont nommés $u 0, $u 1, ..., $u 9.
Le débogueur définit et nomme des alias automatiques.
Définition d’un alias User-Named
Lorsque vous définissez un alias nommé par l’utilisateur, vous pouvez choisir le nom d’alias et l’alias équivalent :
Le nom de l’alias peut être n’importe quelle chaîne qui ne contient pas d’espace blanc.
L’alias équivalent peut être n’importe quelle chaîne. Si vous l’entrez au clavier, l’alias équivalent ne peut pas contenir d’espaces de début ou de retour chariot. Vous pouvez également la définir comme une chaîne en mémoire, la valeur d’une expression numérique, le contenu d’un fichier, la valeur d’une variable d’environnement ou la sortie d’une ou plusieurs commandes de débogueur.
Le nom d’alias et l’alias équivalent respectent la casse.
Pour définir ou redéfinir un alias nommé par l’utilisateur, utilisez la commande (Définir l’alias) ou une commande S (Définir l’alias).
Pour supprimer un alias, utilisez la commande ad (Supprimer l’alias).
Pour répertorier tous les alias actuels nommés par l’utilisateur, utilisez la commande al (List Aliases).
Définition d’un alias Fixed-Name
Il existe 10 alias de nom fixe. Leurs noms d’alias sont $u 0, $u 1, ..., $u 9. Leurs équivalents d’alias peuvent être n’importe quelle chaîne qui ne contient pas la séquence de touches ENTRÉE.
Utilisez la commande r (Registers) pour définir les équivalents d’alias pour les alias à nom fixe. Lorsque vous définissez un alias de nom fixe, vous devez insérer un point (.) avant la lettre « u ». Le texte après le signe égal (=) est l’équivalent de l’alias. L’alias équivalent peut inclure des espaces ou des points-virgules, mais les espaces de début et de fin sont ignorés. Vous ne devez pas placer l’alias équivalent entre guillemets (sauf si vous souhaitez des guillemets dans les résultats).
Note Ne confondez pas l’utilisation de la commande r (Registres) pour les alias de nom fixe. Ces alias ne sont pas des registres ou des pseudo-registres, même si vous utilisez la commande r pour définir leurs équivalents d’alias. Vous n’avez pas besoin d’ajouter un signe at (@) avant ces alias, et vous ne pouvez pas utiliser la commande r pour afficher la valeur de l’un de ces alias.
Par défaut, si vous ne définissez pas d’alias de nom fixe, il s’agit d’une chaîne vide.
Alias automatiques
Le débogueur définit les alias automatiques suivants.
Nom d'alias | Équivalent d’alias |
---|---|
$ntnsym |
Module le plus approprié pour les symboles NT sur l’architecture native de l’ordinateur. Cet alias peut être égal à ntdll ou nt. |
$ntwsym |
Module le plus approprié pour les symboles NT pendant le débogage 32 bits qui utilise WOW64. Cet alias peut être ntdll32 ou une autre version 32 bits de Ntdll.dll. |
$ntsym |
Module le plus approprié pour les symboles NT qui correspondent au mode d’ordinateur actuel. Lorsque vous déboguez en mode natif, cet alias est identique à $ntnsym. Lorsque vous déboguez en mode non natif, le débogueur tente de trouver un module qui correspond à ce mode. (Par exemple, pendant le débogage 32 bits qui utilise WOW64, cet alias est identique à $ntwsym.) |
$CurrentDumpFile |
Nom du dernier fichier de vidage chargé par le débogueur. |
$CurrentDumpPath |
Chemin du répertoire du dernier fichier de vidage que le débogueur a chargé. |
$CurrentDumpArchiveFile |
Nom du dernier fichier d’archive de vidage (fichier CAB) que le débogueur a chargé. |
$CurrentDumpArchivePath |
Chemin du répertoire du dernier fichier d’archive de vidage (fichier CAB) que le débogueur a chargé. |
Les alias automatiques sont similaires aux pseudo-registres automatiques, à ceci près que vous pouvez utiliser des alias automatiques avec des jetons liés aux alias (tels que ${ }), alors que vous ne pouvez pas utiliser de pseudo-registres avec ces jetons.
Utilisation d’un alias dans la fenêtre de commande du débogueur
Après avoir défini un alias, vous pouvez l’utiliser dans n’importe quelle entrée de commande. Le nom de l’alias est automatiquement remplacé par l’alias équivalent. Par conséquent, vous pouvez utiliser l’alias comme expression ou comme macro.
Un nom d’alias se développe correctement même s’il est placé entre guillemets. Étant donné que l’alias équivalent peut inclure n’importe quel nombre de guillemets ou de points-virgules, l’alias équivalent peut représenter plusieurs commandes.
Un alias nommé par l’utilisateur est reconnu uniquement si son nom est séparé des autres caractères par un espace blanc. Le premier caractère de son nom d’alias doit commencer la ligne ou suivre un espace, un point-virgule ou un guillemet. Le dernier caractère de son nom d’alias doit terminer la ligne ou être suivi d’un espace, d’un point-virgule ou d’un guillemet.
Note Tout texte que vous entrez dans la fenêtre Commande du débogueur qui commence par « as », « aS », « ad » ou « al » ne reçoit pas de remplacement d’alias. Cette restriction empêche les commandes d’alias d’être rendues inopérables. Toutefois, cette restriction signifie également que les alias des commandes qui suivent ad ou al sur une ligne ne sont pas remplacées. Si vous souhaitez que les alias soient remplacés dans une ligne qui commence par l’une de ces chaînes, ajoutez un point-virgule avant l’alias.
Toutefois, vous pouvez utiliser le jeton ${ } pour développer un alias nommé par l’utilisateur, même s’il est en regard d’un autre texte. Vous pouvez également utiliser ce jeton avec certains commutateurs pour empêcher l’extension d’un alias ou pour afficher certaines valeurs liées aux alias. Pour plus d’informations sur ces situations, consultez ${ } (Interpréteur d’alias).
Un alias de nom fixe se développe correctement à partir de n’importe quel point d’une ligne, quelle que soit la façon dont il est incorporé dans le texte de la ligne.
Vous ne pouvez pas utiliser des commandes disponibles uniquement dans WinDbg (.open, .write_cmd_hist (Write Command History),.lsrcpath et .lsrcfix) et quelques commandes supplémentaires (.hh, .cls, .wtitle, .remote, .restart en mode noyau et .restart en mode utilisateur) avec des alias.
Utilisation d’un alias dans un fichier de script
Lorsque vous utilisez un alias dans un fichier de script, vous devez veiller particulièrement à ce que l’alias soit développé au bon moment. Considérez le script suivant :
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
La première fois dans la boucle, la commande as, aS (Définir l’alias) affecte une valeur à myAlias. La valeur affectée à myAlias est 1 plus 610000 (la première sortie de la commande dd). Toutefois, lorsque la commande .echo (Echo Comment) est exécutée, myAlias n’a pas encore été développé. Par conséquent, au lieu de voir 610001, nous voyons le texte « myAlias ».
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
Le problème est que myAlias n’est pas développé tant qu’un nouveau bloc de code n’est pas entré. L’entrée suivante de la boucle est un nouveau bloc, de sorte que myAlias est étendu à 610001. Mais il est trop tard : nous aurions dû voir 610001 la première fois dans la boucle, pas la deuxième fois. Nous pouvons résoudre ce problème en plaçant la commande .echo (Echo Comment) dans un nouveau bloc, comme indiqué dans le script suivant.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.block{.echo value myAlias}
}
ad myAlias
Avec le script modifié, nous obtenons la sortie correcte suivante.
0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000
Pour plus d’informations, consultez .block et ${ } (Interpréteur d’alias).
Utilisation d’un jeton .foreach dans un alias
Lorsque vous utilisez un jeton .foreach dans la définition d’un alias, vous devez veiller particulièrement à ce que le jeton soit développé. Considérez la séquence de commandes suivante.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al
La première commande définit la valeur du pseudo-registre $t 0 sur 5. La deuxième commande supprime toute valeur qui a peut-être été précédemment affectée à myAlias. La troisième commande prend le troisième jeton de la commande ?@$t 0 et tente d’affecter la valeur de ce jeton à myAlias. La quatrième commande répertorie tous les alias et leurs valeurs. Nous nous attendons à ce que la valeur de myAlias soit 5, mais à la place, la valeur est le mot « Jeton ».
Alias Value
------- -------
myAlias Token
Le problème est que la commande as se trouve au début de la ligne dans le corps de la boucle .foreach . Lorsqu’une ligne commence par une commande as , les alias et les jetons de cette ligne ne sont pas développés. Si nous placeons un point-virgule ou un espace vide avant la commande as , tout alias ou jeton qui a déjà une valeur est développé. Dans cet exemple, myAlias n’est pas développé, car il n’a pas déjà de valeur. Le jeton est développé, car il a une valeur de 5. Voici la même séquence de commandes avec l’ajout d’un point-virgule avant la commande as .
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al
Nous obtenons maintenant la sortie attendue.
Alias Value
------- -------
myAlias 5
Alias récursifs
Vous pouvez utiliser un alias de nom fixe dans la définition de n’importe quel alias. Vous pouvez également utiliser un alias nommé par l’utilisateur dans la définition d’un alias de nom fixe. Toutefois, pour utiliser un alias nommé par l’utilisateur dans la définition d’un autre alias nommé par l’utilisateur, vous devez ajouter un point-virgule avant la commande as ou aS , sinon le remplacement de l’alias ne se produit pas sur cette ligne.
Lorsque vous utilisez des définitions récursives de ce type, chaque alias est traduit dès qu’il est utilisé. Par exemple, l’exemple suivant affiche 3, et non 7.
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
De même, l’exemple suivant affiche 3, et non 7.
0:000> as fred 2
0:000> r $.u1= 1 + fred
0:000> as fred 6
0:000> ? $u1
Evaluate expression: 3 = 00000003
L’exemple suivant est également autorisé et affiche 9.
0:000> r $.u0=2
0:000> r $.u0=7+$u0
0:000> ? $u0
Evaluate expression: 9 = 00000009
Exemples d’alias
Vous pouvez utiliser des alias pour ne pas avoir à taper des noms de symboles longs ou complexes, comme dans l’exemple suivant.
0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8
L’exemple suivant est similaire à l’exemple précédent, mais il utilise un alias de nom fixe.
0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8
Vous pouvez utiliser des alias comme macros pour les commandes que vous utilisez fréquemment. L’exemple suivant incrémente les registres eax et ebx deux fois.
0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp
L’exemple suivant utilise un alias pour simplifier la saisie des commandes.
0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd
L’exemple suivant est similaire à l’exemple précédent, mais il utilise un alias de nom fixe.
0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5
Les deux exemples précédents sont équivalents à la commande suivante.
0:000> bp MyApi "dd esp 14; g"
fichier Tools.ini
Dans CDB (et NTSD), vous pouvez prédéfinir des alias de nom fixe dans le fichier tools.ini . Pour prédéfinir un alias de nom fixe, ajoutez les champs $u souhaités à votre entrée [NTSD], comme dans l’exemple suivant.
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
Vous ne pouvez pas définir d’alias nommés par l’utilisateur dans le fichier Tools.ini.
alias Fixed-Name et alias User-Named
Les alias de nom d’utilisateur sont plus faciles à utiliser que les alias à nom fixe. Leur syntaxe de définition est plus simple et vous pouvez les répertorier à l’aide de la commande al (List Alias).
Les alias nommés fixes sont remplacés s’ils sont utilisés en regard d’un autre texte. Pour faire en sorte qu’un alias nommé par l’utilisateur soit remplacé lorsqu’il est en regard d’un autre texte, placez-le dans le jeton ${ } (Interpréteur d’alias).
Le remplacement de l’alias de nom fixe se produit avant le remplacement de l’alias nommé par l’utilisateur.