Condividi tramite


s (memoria di ricerca)

Il comando s cerca nella memoria per trovare un modello di byte specifico.

Non confondere questo comando con ~s (Cambia processore corrente), ~s (Imposta thread corrente), |s (Imposta processo corrente)o ||s (Imposta sistema corrente) comandi.

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

Parametri

[ Flag]
Specifica una o più opzioni di ricerca. Ogni flag è una singola lettera. È necessario racchiudere i flag in un singolo set di parentesi quadre ([]). Non è possibile aggiungere spazi tra parentesi quadre, tranne tra n o l e il relativo argomento. Ad esempio, se si desidera specificare le opzioni s e w , usare il comando s -[sw]Type Range Pattern.

È possibile specificare uno o più flag seguenti:

s
Salva tutti i risultati della ricerca corrente. È possibile usare questi risultati per ripetere la ricerca in un secondo momento.

r
Limita la ricerca corrente ai risultati dell'ultima ricerca salvata. Non è possibile usare i flag s e r nello stesso comando. Quando si usa r, il valore di Range viene ignorato e il debugger cerca solo i riscontri salvati dal comando precedente.

n Riscontri
Specifica il numero di riscontri da salvare quando si utilizza il flag s . Il valore predefinito è 1024 riscontri. Se si usa n insieme ad altri flag, n deve essere l'ultimo flag, seguito dal relativo argomento Hits . Lo spazio tra n e Hit è facoltativo, ma non è possibile aggiungere altri spazi all'interno delle parentesi quadre. Se una ricerca successiva che usa il flag s individua più del numero specificato di riscontri, viene visualizzato il messaggio di errore Overflow per notificare che non vengono salvati tutti i riscontri.

Lunghezza l
Fa sì che una ricerca di stringhe ASCII o Unicode arbitrarie restituisca solo stringhe di lunghezza minima. La lunghezza predefinita è 3. Questo valore influisce solo sulle ricerche che usano i flag -sa o -su .

w
Cerca solo aree di memoria scrivibili. È necessario racchiudere "w" tra parentesi quadre.

1
Visualizza solo gli indirizzi delle corrispondenze di ricerca nell'output di ricerca. Questa opzione è utile se si usa il token foreach per inviare tramite pipe l'output del comando all'input di un altro comando.

Digitare
Specifica il tipo di memoria da cercare. Aggiungere un trattino (-) davanti a Type . È possibile usare uno dei valori type seguenti.

Tipo Descrizione

b

Byte (8 bit)

w

WORD (16 bit)

g

DWORD (32 bit)

q

QWORD (64 bit)

a

Stringa ASCII (non necessariamente una stringa con terminazione Null)

u

Stringa Unicode (non necessariamente una stringa con terminazione Null)

Se si omette Tipo, vengono usati i valori di byte. Tuttavia, se si usano flag, non è possibile omettere Type.

Sa
Cerca qualsiasi memoria contenente stringhe ASCII stampabili. Usare il flag l Length per specificare una lunghezza minima di tali stringhe. La lunghezza minima predefinita è 3 caratteri.

su
Cerca qualsiasi memoria contenente stringhe Unicode stampabili. Usare il flag l Length per specificare una lunghezza minima di tali stringhe. La lunghezza minima predefinita è 3 caratteri.

Gamma
Specifica l'area di memoria da cercare. Questo intervallo non può essere lungo più di 256 MB, a meno che non si usi la sintassi L? . Per altre informazioni su questa sintassi, vedere Sintassi dell'intervallo di indirizzi e dell'intervallo di indirizzi.

Modello
Specifica uno o più valori da cercare. Per impostazione predefinita, questi valori sono valori di byte. È possibile specificare tipi diversi di memoria in Tipo. Se si specifica un valore WORD, DWORD o QWORD, a seconda delle altre opzioni selezionate, potrebbe essere necessario racchiudere il criterio di ricerca tra virgolette singole, ad esempio '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 si specifica una stringa, usando il tipo ascii, racchiuderla tra virgolette doppie, ad esempio "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
Cerca oggetti dello stesso tipo dell'oggetto specificato.

Oggetto
Specifica l'indirizzo di un oggetto o l'indirizzo di un puntatore a un oggetto . Il debugger cerca quindi gli oggetti dello stesso tipo dell'oggetto specificato da Object .

Ambiente

Articolo Descrizione
Modalità Modalità utente, modalità kernel
Target Live, crash dump
Piattaforme Tutte le date

Informazioni aggiuntive

Per altre informazioni sulla manipolazione della memoria e una descrizione di altri comandi correlati alla memoria, vedere Lettura e scrittura di memoria.

Osservazioni:

Se il debugger trova il modello di byte specificato, il debugger visualizza il primo indirizzo di memoria nell'area di memoria Intervallo in cui è stato trovato il modello. Il debugger visualizza un estratto di memoria che inizia in tale posizione in un formato che corrisponde al tipo di memoria Type specificato. Se Type è o u, vengono visualizzati il contenuto della memoria e i caratteri ASCII o Unicode corrispondenti.

È necessario specificare il parametro Pattern come una serie di byte, a meno che non si specifichi un valore Type diverso. È possibile immettere valori di byte come caratteri numerici o ASCII:

  • I valori numerici vengono interpretati come numeri nel radix corrente (16, 10 o 8). Per modificare il file radix predefinito, usare il comando n (Imposta base numeri). È possibile eseguire l'override del radix predefinito specificando il prefisso 0x (esadecimale), il prefisso 0n (decimale), il prefisso 0t (ottale) o il prefisso 0y (binary). Nota Il radix predefinito si comporta in modo diverso quando si usano espressioni C++. Per altre informazioni su queste espressioni e sul radix, vedere Valutazione di espressioni.

  • È necessario racchiudere i caratteri ASCII tra virgolette singole. Non è possibile usare caratteri di escape in stile C, ad esempio '\0' o '\n'.

Se si specificano più byte, è necessario separarli in base agli spazi.

I comandi s-a e s-u cercano rispettivamente stringhe ASCII e Unicode specificate. Queste stringhe non devono essere terminate con null.

I comandi s-sa e s-su cercano stringhe ASCII e Unicode non specificate. Questi elementi sono utili se si controlla un intervallo di memoria per verificare se contiene caratteri stampabili. Le opzioni flag consentono di specificare una lunghezza minima di stringa da trovare.

Esempio: il comando seguente trova stringhe ASCII di lunghezza >=3 nell'intervallo a partire da 0000000140000000 e termina 400 byte in un secondo momento.

s-sa 0000000140000000 L400

Il comando seguente trova stringhe ASCII di lunghezza >=4 nell'intervallo a partire da 0000000140000000 e termina 400 byte in un secondo momento

s -[l4]sa 0000000140000000 L400

Il comando seguente esegue la stessa operazione, ma limita la ricerca alle aree di memoria scrivibili.

s -[wl4]sa 0000000140000000 L400

Il comando seguente esegue la stessa operazione, ma visualizza solo l'indirizzo della corrispondenza, anziché l'indirizzo e il valore.

s -[1wl4]sa 0000000140000000 L400

Il comando s-v cerca oggetti dello stesso tipo di dati dell'oggetto Object . È possibile usare questo comando solo se l'oggetto desiderato è una classe C++ o un altro oggetto associato alle tabelle delle funzioni virtuali (Vtable). Il comando s-v cerca gli indirizzi delle tabelle virtuali della classe nell'area di memoria Range . Se in questa classe sono presenti più tabelle virtuali, l'algoritmo di ricerca cerca tutti questi valori del puntatore, separati dal numero appropriato di byte. Se vengono trovate corrispondenze, il debugger restituisce l'indirizzo di base dell'oggetto e informazioni complete su questo oggetto, simile all'output del comando dt (tipo di visualizzazione).

Esempio: si supponga che il radix corrente sia 16. I tre comandi seguenti eseguono tutte la stessa operazione: cercare i percorsi di memoria da 0012FF40 a 0012FF5F per "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" 

Questi comandi individuano ogni aspetto di "Hello" e restituiscono l'indirizzo di ogni modello, ovvero l'indirizzo della lettera "H".

Il debugger restituisce solo i modelli completamente contenuti nell'intervallo di ricerca. I modelli sovrapposti vengono trovati correttamente. In altre parole, il modello "QQQ" viene trovato tre volte in "QQQQQ".)

Nell'esempio seguente viene illustrata una ricerca che usa il parametro Type . Questo comando cerca i percorsi di memoria da 0012FF40 a 0012FF5F per la parola doppia "VUTS":

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

Nei computer little-endian 'VUTS' è uguale al modello di byte 'S' 'T' 'U' 'V'. Tuttavia, le ricerche di OGGETTI WORD, DWORD e QWORD restituiscono solo risultati allineati correttamente ai byte.