Usando aliases
Aliases são cadeias de caracteres que são automaticamente substituídas por outras cadeias de caracteres. Você pode usá-los em comandos de depurador e para evitar a redimensão de determinadas frases comuns.
Um alias consiste em um nome de alias e um alias equivalente. Quando você usa um nome de alias como parte de um comando de depurador, o nome é substituído automaticamente pelo alias equivalente. Essa substituição ocorre imediatamente, antes que o comando seja analisado ou executado.
O depurador dá suporte a três tipos de aliases:
Você pode definir e nomear aliases nomeados pelo usuário.
Você pode definir aliases de nome fixo, mas eles são nomeados $u 0, $u 1, ..., $u 9.
O depurador define e nomeia aliases automáticos.
Definindo um Alias User-Named
Ao definir um alias chamado pelo usuário, você pode escolher o nome do alias e o alias equivalente:
O nome do alias pode ser qualquer cadeia de caracteres que não contenha espaço em branco.
O alias equivalente pode ser qualquer cadeia de caracteres. Se você inseri-lo no teclado, o alias equivalente não poderá conter espaços à esquerda ou retornos de carro. Como alternativa, você pode defini-lo igual a uma cadeia de caracteres na memória, o valor de uma expressão numérica, o conteúdo de um arquivo, o valor de uma variável de ambiente ou a saída de um ou mais comandos de depurador.
O nome do alias e o alias equivalente diferenciam maiúsculas de minúsculas.
Para definir ou redefinir um alias chamado pelo usuário, use o comando como (Definir Alias) ou aS (Definir Alias).
Para remover um alias, use o comando ad (Excluir Alias).
Para listar todos os aliases nomeados pelo usuário atual, use o comando al (Listar Aliases).
Definindo um Alias Fixed-Name
Há 10 aliases de nome fixo. Seus nomes de alias são $u 0, $u 1, ..., $u 9. Seus equivalentes de alias podem ser qualquer cadeia de caracteres que não contenha o pressionamento de tecla ENTER.
Use o comando r (Registros) para definir os equivalentes de alias para aliases de nome fixo. Ao definir um alias de nome fixo, você deve inserir um ponto (.) antes da letra "u". O texto após o sinal de igual (=) é equivalente ao alias. O alias equivalente pode incluir espaços ou ponto e vírgula, mas espaços à esquerda e à direita são ignorados. Você não deve colocar o alias equivalente entre aspas (a menos que você queira aspas nos resultados).
Nota Não se confunda usando o comando r (Registros) para aliases de nome fixo. Esses aliases não são registros ou pseudo-registros, mesmo que você use o comando r para definir seus equivalentes de alias. Você não precisa adicionar um sinal de at (@) antes desses aliases e não pode usar o comando r para exibir o valor de um desses aliases.
Por padrão, se você não definir um alias de nome fixo, ele será uma cadeia de caracteres vazia.
Aliases automáticos
O depurador define os aliases automáticos a seguir.
Nome do alias | Equivalente a alias |
---|---|
$ntnsym |
O módulo mais apropriado para símbolos NT na arquitetura nativa do computador. Esse alias pode ser igual a ntdll ou nt. |
$ntwsym |
O módulo mais apropriado para símbolos NT durante a depuração de 32 bits que usa WOW64. Esse alias pode ser ntdll32 ou alguma outra versão de 32 bits do Ntdll.dll. |
$ntsym |
O módulo mais apropriado para símbolos NT que correspondem ao modo de computador atual. Quando você está depurando no modo nativo, esse alias é o mesmo que $ntnsym. Quando você está depurando em um modo não nativo, o depurador tenta encontrar um módulo que corresponda a esse modo. (Por exemplo, durante a depuração de 32 bits que usa WOW64, esse alias é o mesmo que $ntwsym.) |
$CurrentDumpFile |
O nome do último arquivo de despejo que o depurador carregou. |
$CurrentDumpPath |
O caminho do diretório do último arquivo de despejo que o depurador carregou. |
$CurrentDumpArchiveFile |
O nome do último arquivo de arquivo de despejo (arquivo CAB) que o depurador carregou. |
$CurrentDumpArchivePath |
O caminho do diretório do último arquivo de arquivo de despejo (arquivo CAB) que o depurador carregou. |
Os aliases automáticos são semelhantes a pseudo-registros automáticos, exceto que você pode usar aliases automáticos com tokens relacionados a alias (como ${ }), enquanto você não pode usar pseudo-registros com esses tokens.
Usando um Alias na janela Comando do Depurador
Depois de definir um alias, você pode usá-lo em qualquer entrada de comando. O nome do alias é substituído automaticamente pelo alias equivalente. Portanto, você pode usar o alias como uma expressão ou como uma macro.
Um nome de alias se expande corretamente mesmo que esteja entre aspas. Como o alias equivalente pode incluir qualquer número de aspas ou ponto-e-vírgula, o alias equivalente pode representar vários comandos.
Um alias nomeado pelo usuário será reconhecido somente se seu nome for separado de outros caracteres por espaço em branco. O primeiro caractere de seu nome de alias deve iniciar a linha ou seguir um espaço, um ponto e vírgula ou uma aspa. O último caractere de seu nome de alias deve terminar a linha ou ser seguido por um espaço, um ponto e vírgula ou uma aspa.
Nota Qualquer texto inserido na janela Comando do Depurador que começa com "as", "aS", "ad" ou "al" não recebe substituição de alias. Essa restrição impede que os comandos de alias sejam renderizados inoperáveis. No entanto, essa restrição também significa que os comandos que seguem ad ou al em uma linha não têm seus aliases substituídos. Se você quiser que os aliases sejam substituídos em uma linha que comece com uma dessas cadeias de caracteres, adicione um ponto e vírgula antes do alias.
No entanto, você pode usar o token ${ } para expandir um alias chamado pelo usuário mesmo quando ele estiver ao lado de outro texto. Você também pode usar esse token junto com determinadas opções para impedir que um alias seja expandido ou para exibir determinados valores relacionados a alias. Para obter mais informações sobre essas situações, consulte ${ } (Interpretador de Alias).
Um alias de nome fixo se expande corretamente de qualquer ponto dentro de uma linha, independentemente de como ele é inserido no texto da linha.
Você não pode usar comandos disponíveis apenas no WinDbg (.open, .write_cmd_hist (Histórico de Comandos de Gravação), .lsrcpath e .lsrcfix) e alguns comandos adicionais (.hh, .cls, .wtitle, .remote, kernel-mode .restart e .restart no modo de usuário) com aliases.
Usando um Alias em um arquivo de script
Ao usar um alias em um arquivo de script, você deve tomar cuidado especial para garantir que o alias seja expandido no momento correto. Considere o seguinte script:
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
Na primeira vez por meio do loop, o comando aS (Definir Alias) atribui um valor ao myAlias. O valor atribuído a myAlias é 1 mais 610000 (a primeira saída do comando dd). No entanto, quando o comando .echo (Echo Comment) é executado, myAlias ainda não foi expandido, portanto, em vez de ver 610001, vemos o texto "myAlias".
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
O problema é que myAlias não é expandido até que um novo bloco de código seja inserido. A próxima entrada do loop é um novo bloco, portanto, myAlias é expandido para 610001. Mas é tarde demais: deveríamos ter visto 610001 a primeira vez através do loop, não da segunda vez. Podemos corrigir esse problema colocando o comando .echo (Echo Comment) em um novo bloco, conforme mostrado no script a seguir.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.block{.echo value myAlias}
}
ad myAlias
Com o script alterado, obtemos a saída correta a seguir.
0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000
Para obter mais informações, consulte .block e ${ } (Interpretador de Alias).
Usando um token .foreach em um Alias
Ao usar um token .foreach na definição de um alias, você deve ter um cuidado especial para garantir que o token seja expandido. Considere a sequência de comandos a seguir.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al
O primeiro comando define o valor do registro pseudo $t 0 como 5. O segundo comando exclui qualquer valor que possa ter sido atribuído anteriormente a myAlias. O terceiro comando usa o terceiro token do comando ?@$t 0 e tenta atribuir o valor desse token a myAlias. O quarto comando lista todos os aliases e seus valores. Esperamos que o valor de myAlias seja 5, mas, em vez disso, o valor é a palavra "Token".
Alias Value
------- -------
myAlias Token
O problema é que o comando as está no início da linha no corpo do loop .foreach . Quando uma linha começa com um comando as , os aliases e tokens nessa linha não são expandidos. Se colocarmos um ponto e vírgula ou espaço em branco antes do comando como , qualquer alias ou token que já tenha um valor será expandido. Neste exemplo, myAlias não está expandido porque ainda não tem um valor. O token é expandido porque tem um valor de 5. Aqui está a mesma sequência de comandos com a adição de um ponto e vírgula antes do comando como .
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al
Agora, obtemos a saída esperada.
Alias Value
------- -------
myAlias 5
Aliases recursivos
Você pode usar um alias de nome fixo na definição de qualquer alias. Você também pode usar um alias nomeado pelo usuário na definição de um alias de nome fixo. No entanto, para usar um alias nomeado pelo usuário na definição de outro alias nomeado pelo usuário, você precisa adicionar um ponto e vírgula antes do comando as ou aS , ou então a substituição de alias não ocorre nessa linha.
Quando você estiver usando definições recursivas desse tipo, cada alias será traduzido assim que for usado. Por exemplo, o exemplo a seguir exibe 3, não 7.
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
Da mesma forma, o exemplo a seguir exibe 3, não 7.
0:000> as fred 2
0:000> r $.u1= 1 + fred
0:000> as fred 6
0:000> ? $u1
Evaluate expression: 3 = 00000003
O exemplo a seguir também é permitido e exibe 9.
0:000> r $.u0=2
0:000> r $.u0=7+$u0
0:000> ? $u0
Evaluate expression: 9 = 00000009
Exemplos de alias
Você pode usar aliases para não precisar digitar nomes de símbolos longos ou complexos, como no exemplo a seguir.
0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8
O exemplo a seguir é semelhante ao exemplo anterior, mas usa um alias de nome fixo.
0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8
Você pode usar aliases como macros para comandos usados com frequência. O exemplo a seguir incrementa os registros eax e ebx duas vezes.
0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp
O exemplo a seguir usa um alias para simplificar a digitação de comandos.
0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd
O exemplo a seguir é semelhante ao exemplo anterior, mas usa um alias de nome fixo.
0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5
Ambos os exemplos anteriores são equivalentes ao comando a seguir.
0:000> bp MyApi "dd esp 14; g"
Arquivo Tools.ini
No CDB (e no NTSD), você pode predefine aliases de nome fixo no arquivo tools.ini . Para predefine um alias de nome fixo, adicione os campos de $u que você deseja para sua entrada [NTSD], como no exemplo a seguir.
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
Não é possível definir aliases nomeados pelo usuário no arquivo Tools.ini.
Aliases Fixed-Name versus aliases User-Named
Aliases de nome de usuário são mais fáceis de usar do que aliases de nome fixo. Sua sintaxe de definição é mais simples e você pode listá-las usando o comando al (Listar Aliases).
Os aliases nomeados fixos serão substituídos se forem usados ao lado de outro texto. Para fazer com que um alias nomeado pelo usuário seja substituído quando estiver ao lado de outro texto, coloque-o no token ${ } (Interpretador de Alias).
A substituição de alias de nome fixo ocorre antes da substituição de alias nomeada pelo usuário.