Partilhar via


Usando pseudónimos

Aliases são cadeias de caracteres que são automaticamente substituídas por outras cadeias de caracteres. Você pode usá-los em comandos do depurador e para evitar ter de redigitar certas 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 é automaticamente substituído pelo alias equivalente. Essa substituição ocorre imediatamente, antes que o comando seja analisado ou executado.

O depurador suporta 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 nomeado 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 inserir no teclado, o alias equivalente não pode conter espaços à esquerda ou retornos de linha. 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 do depurador.

Tanto o nome do alias quanto o alias equivalente são sensíveis a maiúsculas e minúsculas.

Para definir ou redefinir um alias nomeado pelo usuário, use o comando as (set Alias) ou aS (set Alias ).

Para remover um alias, use o comando ad (Delete Alias).

Para listar todos os aliases nomeados pelo usuário atuais, use o comando al (List Aliases).

Definindo um alias Fixed-Name

Existem 10 aliases de nome fixo. Os seus pseudónimos 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 (Registers) 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 (=) é o alias equivalente. O alias equivalente pode incluir espaços ou ponto-e-vírgula, mas os espaços à esquerda e à direita são ignorados. Você não deve colocar o alias equivalente entre aspas (a menos que queira aspas nos resultados).

Observação Não se confunda usando o comando r (Registers) 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. Não é necessário adicionar um sinal at (@) antes desses aliases e não é possível 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 seguintes aliases automáticos.

Nome alternativo Alias equivalente

$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 máquina atual. Quando estiveres a depurar no modo nativo, este 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 despejo (arquivo CAB) que o depurador carregou.

$CurrentDumpArchivePath

O caminho do diretório do último arquivo de despejo (arquivo CAB) que o depurador carregou.

Os aliases automáticos são semelhantes aos pseudo-registros automáticos, exceto que você pode usar aliases automáticos com tokens relacionados a alias (como ${ }), enquanto não pode usar pseudo-registros com esses tokens.

Usando um alias na janela de comando do depurador

Depois de definir um alias, você pode usá-lo em qualquer entrada de comando. O nome do alias é automaticamente substituído 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 se estiver 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 é reconhecido somente se seu nome estiver separado de outros caracteres por espaço em branco. O primeiro caractere do nome do alias deve começar a linha ou seguir um espaço, um ponto-e-vírgula ou aspas. O último caractere do nome do alias deve estar no final da linha ou ser seguido por um espaço, um ponto-e-vírgula ou uma aspa.

Observação Qualquer texto inserido na janela de comando do depurador que comece com "as", "aS", "ad" ou "al" não receberá substituição de alias. Essa restrição impede que os comandos de alias fiquem inoperantes. 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 desejar 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 nomeado 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 ao alias. Para obter mais informações sobre essas situações, consulte ${ } (Alias Interpreter).

Um alias de nome fixo se expande corretamente de qualquer ponto dentro de uma linha, independentemente de como ele é incorporado no texto da linha.

Não é possível usar comandos que estão disponíveis apenas no WinDbg (.open, .write_cmd_hist (Write Command History), .lsrcpath e .lsrcfix) e alguns comandos adicionais (.hh, .cls, .wtitle, .remote, kernel-mode .restart e user-mode .restart) 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 através do loop, o comando as, aS (set 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 para o loop é um novo bloco, então myAlias é expandido para 610001. Mas é tarde demais: deveríamos ter visto 610001 primeira vez através do loop, não a 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 seguinte saída correta.

0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000

Para obter mais informações, consulte .block e ${ } (Alias Interpreter).

Usando um token .foreach em um alias

Ao usar um token .foreach na definição de um alias, você deve tomar cuidado especial para garantir que o token seja expandido. Considere a seguinte sequência de comandos.

r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al

O primeiro comando define o valor do pseudo-registro $t 0 como 5. O segundo comando exclui qualquer valor que possa ter sido atribuído anteriormente a myAlias. O terceiro comando pega 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. Esperaríamos que o valor de myAlias fosse 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 as , qualquer alias ou token que já tenha um valor será expandido. Neste exemplo, myAlias não é 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 as .

r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al

Agora obtemos o resultado esperado.

  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 a substituição do 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 que você usa com freqüê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"

Ficheiro Tools.ini

Em CDB (e NTSD), você pode predefinir aliases de nome fixo no arquivo tools.ini . Para predefinir um alias de nome fixo, adicione os campos $u desejados à 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.

Fixed-Name Aliases vs. User-Named Aliases

Os aliases de nome de usuário são mais fáceis de usar do que os aliases de nome fixo. Sua sintaxe de definição é mais simples, e você pode listá-los usando o comando al (List Aliases ).

Os aliases de nome fixo sã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 ${ } (Intérprete de Alias ).

A substituição de alias com nome fixo ocorre antes da substituição de alias nomeado pelo usuário.