s (Pesquisar Memória)

O comando s pesquisa na memória para encontrar um padrão de byte específico.

Não confunda esse comando com os ~s (Alterar Processador Atual),~s (Definir Thread Atual), |s (Definir Processo Atual)ou ||s (Definir sistema atual).

s [-[[Flags]Type]] Range Pattern 
s -[[Flags]]v Range Object 
s -[[Flags]]sa Range 
s -[[Flags]]su Range 

Parâmetros

[Sinalizadores]
Especifica uma ou mais opções de pesquisa. Cada sinalizador é uma única letra. Você deve colocar os sinalizadores em um único conjunto de colchetes ([]). Você não pode adicionar espaços entre os colchetes, exceto entre n ou l e seu argumento. Por exemplo, se você quiser especificar as opções s e w , use o comando s -[sw]Type Range Pattern.

Você pode especificar um ou mais dos seguintes sinalizadores:

s
Salva todos os resultados da pesquisa atual. Você pode usar esses resultados para repetir a pesquisa mais tarde.

R
Restringe a pesquisa atual aos resultados da última pesquisa salva. Não é possível usar os sinalizadores s e r no mesmo comando. Quando você usa r, o valor de Range é ignorado e o depurador pesquisa apenas os acertos que foram salvos pelo comando s anterior.

nOcorrências
Especifica o número de ocorrências a serem salvas quando você usa o sinalizador s . O valor padrão é 1024 ocorrências. Se você usar n junto com outros sinalizadores, n deverá ser o último sinalizador, seguido pelo argumento Hits . O espaço entre n e Hits é opcional, mas você não pode adicionar outros espaços dentro dos colchetes. Se qualquer pesquisa posterior que usa o sinalizador s descobrir mais do que o número especificado de ocorrências, a mensagem de erro Estouro será exibida para notificá-lo de que nem todas as ocorrências estão sendo salvas.

lComprimento
Faz com que uma pesquisa de cadeias de caracteres ARbitrárias ASCII ou Unicode retorne apenas cadeias de caracteres que têm pelo menos caracteres length . O comprimento padrão é 3. Esse valor afeta apenas pesquisas que usam os sinalizadores -sa ou -su .

W
Pesquisa apenas regiões de memória graváveis. Você deve colocar o "w" entre colchetes.

1
Exibe apenas os endereços das correspondências de pesquisa na saída da pesquisa. Essa opção será útil se você estiver usando o token .foreach para redirecionar a saída do comando para a entrada de outro comando.

Type
Especifica o tipo de memória a ser pesquisado. Adicione um hífen (-) na frente do Tipo . Você pode usar um dos seguintes valores de Tipo .

Tipo Descrição

b

Byte (8 bits)

w

WORD (16 bits)

d

DWORD (32 bits)

Q

QWORD (64 bits)

a

Cadeia de caracteres ASCII (não necessariamente uma cadeia de caracteres terminada em nulo)

u

Cadeia de caracteres Unicode (não necessariamente uma cadeia de caracteres terminada em nulo)

Se você omitir Tipo, os valores de bytes serão usados. No entanto, se você usar Sinalizadores, não poderá omitir Type.

Sa
Pesquisa qualquer memória que contenha cadeias de caracteres ASCII imprimíveis. Use o sinalizador lLength para especificar um comprimento mínimo dessas cadeias de caracteres. O comprimento mínimo padrão é de 3 caracteres.

Su
Pesquisa qualquer memória que contenha cadeias de caracteres Unicode imprimíveis. Use o sinalizador lLength para especificar um comprimento mínimo dessas cadeias de caracteres. O comprimento mínimo padrão é de 3 caracteres.

Gama
Especifica a área de memória a ser pesquisada. Esse intervalo não pode ter mais de 256 MB de comprimento, a menos que você use a sintaxe L? . Para obter mais informações sobre essa sintaxe, consulte Sintaxe do intervalo de endereços e endereços.

Padrão
Especifica um ou mais valores a serem pesquisados. Por padrão, esses valores são valores de bytes. Você pode especificar diferentes tipos de memória no Tipo. Se você especificar um valor WORD, DWORD ou QWORD, dependendo das outras opções selecionadas, talvez seja necessário colocar o padrão de pesquisa entre aspas simples (por exemplo, 'H').

0:000> s -d @rsp L1000000 'H'  
0000003f`ff07ec00  00000048 00000000 500c0163 00000000  H.......c..P....
0000003f`ff07ec50  00000048 00000000 00000080 00000000  H...............
0000003f`ff07efc0  00000048 00000000 400c0060 00000000  H.......`..@....

Se você especificar uma cadeia de caracteres, usando o tipo ascii, coloque-a entre aspas duplas (por exemplo, "B7").

0:000> s -a @rsp L10000000 "B7"  
0000003f`ff07ef0a  42 37 ff 7f 00 00 90 38-4e c2 6c 01 00 00 7d 26  B7.....8N.l...}&
0000003f`ff0ff322  42 37 ff 7f 00 00 f8 5d-42 37 ff 7f 00 00 20 41  B7.....]B7.... A
0000003f`ff0ff32a  42 37 ff 7f 00 00 20 41-42 37 ff 7f 00 00 98 59  B7.... AB7.....Y

-V
Pesquisa objetos do mesmo tipo que o Objeto especificado.

Objeto
Especifica o endereço de um objeto ou o endereço de um ponteiro para um objeto . Em seguida, o depurador pesquisa objetos do mesmo tipo que o objeto especificado por Object .

Ambiente

Item Descrição
Modos Modo de usuário, modo kernel
Destinos Ao vivo, despejo de memória
Plataformas Tudo

Informações adicionais

Para obter mais informações sobre manipulação de memória e uma descrição de outros comandos relacionados à memória, consulte Leitura e gravação de memória.

Comentários

Se o depurador encontrar o padrão de bytes especificado, o depurador exibirá o primeiro endereço de memória na área Memória de intervalo em que o padrão foi encontrado. O depurador exibe um trecho de memória que começa nesse local em um formato que corresponde ao tipo de memória Type especificado. Se Type for um ou u, o conteúdo da memória e os caracteres ASCII ou Unicode correspondentes serão exibidos.

Você deve especificar o parâmetro Pattern como uma série de bytes, a menos que especifique um valor de Tipo diferente. Você pode inserir valores de bytes como caracteres numéricos ou ASCII:

  • Os valores numéricos são interpretados como números no radix atual (16, 10 ou 8). Para alterar o radix padrão, use o comando n (Definir Base numérica ). Você pode substituir o radix padrão especificando o prefixo 0x (hexadecimal), o prefixo de 0n (decimal), o prefixo 0t (octal) ou o prefixo 0y (binário). Nota O radix padrão se comporta de forma diferente quando você usa expressões C++. Para obter mais informações sobre essas expressões e o radix, consulte Avaliando expressões.

  • Você deve colocar caracteres ASCII entre aspas simples e retas. Não é possível usar caracteres de escape no estilo C (como '\0' ou '\n').

Se você especificar vários bytes, deverá separá-los por espaços.

Os comandos s-a e s-u pesquisam cadeias de caracteres ASCII e Unicode especificadas, respectivamente. Essas cadeias de caracteres não precisam ser terminadas em nulo.

Os comandos s-sa e s-su pesquisam cadeias de caracteres ASCII e Unicode não especificadas. Eles serão úteis se você estiver verificando um intervalo de memória para ver se ele contém caracteres imprimíveis. As opções de sinalizadores permitem que você especifique um comprimento mínimo de cadeia de caracteres a ser localizado.

Exemplo: o comando a seguir localiza cadeias de caracteres ASCII que têm comprimento >=3 no intervalo começando em 0000000140000000 e terminando 400 bytes posteriormente.

s-sa 0000000140000000 L400

O comando a seguir localiza cadeias de caracteres ASCII que têm comprimento >=4 no intervalo começando em 0000000140000000 e terminando 400 bytes posteriormente

s -[l4]sa 0000000140000000 L400

O comando a seguir faz a mesma coisa, mas limita a pesquisa a regiões de memória graváveis.

s -[wl4]sa 0000000140000000 L400

O comando a seguir faz a mesma coisa, mas exibe apenas o endereço da correspondência, em vez do endereço e do valor.

s -[1wl4]sa 0000000140000000 L400

O comando s-v pesquisa objetos do mesmo tipo de dados que o objeto Object . Você só poderá usar esse comando se o objeto desejado for uma classe C++ ou outro objeto associado a tabelas de funções virtuais (Vtables). O comando s-v pesquisa na área Memória de intervalo para os endereços das Vtables dessa classe. Se houver várias Vtables nessa classe, o algoritmo de pesquisa procurará todos esses valores de ponteiro, separados pelo número adequado de bytes. Se alguma correspondência for encontrada, o depurador retornará o endereço base do objeto e informações completas sobre esse objeto , semelhante à saída do comando dt (Tipo de Exibição).

Exemplo: suponha que o radix atual seja 16. Os três comandos a seguir fazem a mesma coisa: pesquisar locais de memória 0012FF40 a 0012FF5F para "Hello".

0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o' 
0:000> s 0012ff40 L20 48 65 6c 6c 6f 
0:000> s -a 0012ff40 L20 "Hello" 

Esses comandos localizam cada aparência de "Olá" e retornam o endereço de cada padrão, ou seja, o endereço da letra "H".

O depurador retorna apenas padrões que estão completamente contidos no intervalo de pesquisa. Os padrões sobrepostos são encontrados corretamente. (Em outras palavras, o padrão "QQQ" é encontrado três vezes em "QQQQQ".)

O exemplo a seguir mostra uma pesquisa que usa o parâmetro Type . Este comando pesquisa os locais de memória 0012FF40 a 0012FF5F para a palavra dupla 'VUTS':

0:000> s -d 0012ff40 L20 'VUTS' 

Em computadores little-endian, 'VUTS' é o mesmo que o padrão de byte 'S' 'T' 'U' 'V'. No entanto, as pesquisas por WORDs, DWORDs e QWORDs retornam apenas resultados alinhados corretamente.