Partilhar via


s (Memória de Pesquisa)

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

Não confunda este comando com ~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

[ Bandeiras]
Especifica uma ou mais opções de pesquisa. Cada bandeira é uma única letra. Você deve colocar os sinalizadores em um único conjunto de colchetes ([]). Você não pode adicionar espaços entre 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. Você não pode usar os sinalizadores s e r no mesmo comando. Quando você usa r, o valor de Range é ignorado e o depurador pesquisa apenas as ocorrências que foram salvas pelo comando s anterior.

n Hits
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 por seu argumento Hits . O espaço entre n e Hits é opcional, mas você não pode adicionar nenhum outro espaço entre colchetes. Se qualquer pesquisa posterior que use 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.

l Comprimento
Faz com que uma pesquisa por cadeias de caracteres ASCII ou Unicode arbitrárias retorne apenas cadeias de caracteres com pelo menos caracteres de comprimento . O comprimento padrão é 3. Esse valor afeta apenas as 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 canalizar a saída do comando para a entrada de outro comando.

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

Tipo Descrição

b

Byte (8 bits)

w

PALAVRA (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 Type, os valores de byte serão usados. No entanto, se você usar Sinalizadores, não poderá omitir Tipo.

Sa
Pesquisa qualquer memória que contenha cadeias de caracteres ASCII imprimíveis. Use o sinalizador l Length 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 l Length 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, a menos que você use a sintaxe L? . Para obter mais informações sobre essa sintaxe, consulte Sintaxe de endereço e intervalo de endereços.

Padrão
Especifica um ou mais valores a serem pesquisados. Por padrão, esses valores são valores de byte. Você pode especificar diferentes tipos de memória em 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 procura 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 Lendo e gravando 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 de memória 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 Tipo especificado. Se Type for a 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 Type diferente. Você pode inserir valores de byte como caracteres numéricos ou ASCII:

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

  • Você deve colocar caracteres ASCII entre aspas simples e retas. Você não pode 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 procuram 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 procuram cadeias de caracteres ASCII e Unicode não especificadas. Eles sã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 de comprimento >=3 no intervalo que começa em 0000000140000000 e termina 400 bytes depois.

s-sa 0000000140000000 L400

O comando a seguir localiza cadeias de caracteres ASCII de comprimento >=4 no intervalo que começa em 0000000140000000 e termina 400 bytes depois

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 procura 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 de memória do intervalo os endereços dos Vtables dessa classe. Se existirem vários 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 a base atual seja 16. Os três comandos a seguir fazem a mesma coisa: pesquise os locais de memória 0012FF40 a 0012FF5F para "Olá".

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 um desses padrões, 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 bytes 'S' 'T' 'U' 'V'. No entanto, as pesquisas por WORDs, DWORDs e QWORDs retornam apenas resultados alinhados corretamente a bytes.