s (Speicher durchsuchen)

Der Befehl s durchsucht den Arbeitsspeicher, um ein bestimmtes Bytemuster zu finden.

Verwechseln Sie diesen Befehl nicht mit den ~s (Aktuellen Prozessor ändern),~s (Aktuellen Thread festlegen),|s (Aktuellen Prozess festlegen) oder ||s -Befehle (Aktuelles System festlegen).

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

Parameter

[Flags]
Gibt eine oder mehrere Suchoptionen an. Jedes Flag ist ein einzelner Buchstabe. Sie müssen die Flags in einen einzelnen Satz von Klammern ([]) einschließen. Sie können keine Leerzeichen zwischen den Klammern hinzufügen, außer zwischen n oder l und dem zugehörigen Argument. Wenn Sie beispielsweise die Optionen s und w angeben möchten, verwenden Sie den Befehl s -[sw]Type Range Pattern.

Sie können eines oder mehrere der folgenden Flags angeben:

s
Speichert alle Ergebnisse der aktuellen Suche. Sie können diese Ergebnisse verwenden, um die Suche später zu wiederholen.

R
Schränkt die aktuelle Suche auf die Ergebnisse der letzten gespeicherten Suche ein. Sie können die Flags s und r nicht im gleichen Befehl verwenden. Wenn Sie r verwenden, wird der Wert von Range ignoriert, und der Debugger sucht nur die Treffer, die vom vorherigen s-Befehl gespeichert wurden.

nTreffer
Gibt die Anzahl der zu speichernden Treffer an, wenn Sie das Flag s verwenden. Der Standardwert ist 1024 Treffer. Wenn Sie n zusammen mit anderen Flags verwenden, muss n das letzte Flag sein, gefolgt vom Trefferargument . Das Leerzeichen zwischen n und Treffern ist optional, sie können jedoch keine weiteren Leerzeichen innerhalb der Klammern hinzufügen. Wenn eine spätere Suche, die das s-Flag verwendet, mehr als die angegebene Anzahl von Treffern ermittelt, wird die Fehlermeldung Überlauf angezeigt, um Sie darüber zu informieren, dass nicht alle Treffer gespeichert werden.

lLänge
Bewirkt, dass bei einer Suche nach beliebigen ASCII- oder Unicode-Zeichenfolgen nur Zeichenfolgen zurückgegeben werden, die mindestens lang sind. Die Standardlänge ist 3. Dieser Wert wirkt sich nur auf Suchvorgänge aus, die die Flags "-sa " oder "-su " verwenden.

W
Durchsucht nur schreibbare Speicherbereiche. Sie müssen das "w" in Klammern einschließen.


Zeigt nur die Adressen von Suchergebnissen in der Suchausgabe an. Diese Option ist nützlich, wenn Sie das Foreach-Token verwenden, um die Befehlsausgabe an die Eingabe eines anderen Befehls zu übergeben.

Type
Gibt den speichertyp an, nach dem gesucht werden soll. Fügen Sie einen Bindestrich (-) vor typ hinzu. Sie können einen der folgenden Type-Werte verwenden.

Typ BESCHREIBUNG

b

Byte (8 Bits)

w

WORD (16 Bits)

d

DWORD (32 Bits)

Q

QWORD (64 Bits)

a

ASCII-Zeichenfolge (nicht notwendigerweise eine NULL-endende Zeichenfolge)

n

Unicode-Zeichenfolge (nicht notwendigerweise eine null-endende Zeichenfolge)

Wenn Sie Type weglassen, werden Bytewerte verwendet. Wenn Sie jedoch Flags verwenden, können Sie Type nicht weglassen.

Sa
Sucht nach beliebigem Arbeitsspeicher, der druckbare ASCII-Zeichenfolgen enthält. Verwenden Sie das lLength-Flag , um eine Mindestlänge solcher Zeichenfolgen anzugeben. Die Standardmäßige Mindestlänge beträgt 3 Zeichen.

Su
Sucht nach beliebigem Arbeitsspeicher, der druckbare Unicode-Zeichenfolgen enthält. Verwenden Sie das lLength-Flag , um eine Mindestlänge solcher Zeichenfolgen anzugeben. Die Standardmäßige Mindestlänge beträgt 3 Zeichen.

Bereich
Gibt den zu durchsuchenden Speicherbereich an. Dieser Bereich darf nicht mehr als 256 MB lang sein, es sei denn, Sie verwenden die L?- Syntax. Weitere Informationen zu dieser Syntax finden Sie unter Adress- und Adressbereichssyntax.

Muster
Gibt einen oder mehrere zu suchde Werte an. Standardmäßig handelt es sich bei diesen Werten um Bytewerte. Sie können unter Typ verschiedene Speichertypen angeben. Wenn Sie einen WORD-, DWORD- oder QWORD-Wert angeben, müssen Sie je nach den anderen ausgewählten Optionen das Suchmuster möglicherweise in einfache Anführungszeichen einschließen (z. B. "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.......`..@....

Wenn Sie eine Zeichenfolge mit dem ASCII-Typ angeben, schließen Sie sie in doppelte Anführungszeichen ein (z. B. "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
Sucht nach Objekten desselben Typs wie das angegebene Objekt.

Objekt
Gibt die Adresse eines Objekts oder die Adresse eines Zeigers auf ein Objekt an. Der Debugger sucht dann nach Objekten desselben Typs wie das Objekt, das Object angibt.

Environment

Element BESCHREIBUNG
Modi Benutzermodus, Kernelmodus
Targets Liveabbild, Absturzabbild
Plattformen All

Zusätzliche Informationen

Weitere Informationen zur Speicherbearbeitung und eine Beschreibung anderer speicherbezogener Befehle finden Sie unter Lesen und Schreiben von Arbeitsspeicher.

Hinweise

Wenn der Debugger das von Ihnen angegebene Bytemuster findet, zeigt der Debugger die erste Speicheradresse im Bereich arbeitsspeicherbereich an, in dem das Muster gefunden wurde. Der Debugger zeigt einen Speicherausschnitt an, der an dieser Stelle beginnt, in einem Format, das dem angegebenen Typ des Arbeitsspeichertyps entspricht . Wenn Typeein oder u ist, werden der Speicherinhalt und die entsprechenden ASCII- oder Unicode-Zeichen angezeigt.

Sie müssen den Pattern-Parameter als Eine Reihe von Bytes angeben, es sei denn, Sie geben einen anderen Type-Wert an. Sie können Bytewerte als numerische oder ASCII-Zeichen eingeben:

  • Numerische Werte werden als Zahlen im aktuellen Radix interpretiert (16, 10 oder 8). Um den Standardradix zu ändern, verwenden Sie den Befehl n (Set Number Base). Sie können den Standardradiix überschreiben, indem Sie das Präfix 0x (hexadezimal), das Präfix 0n (dezimal), das Präfix 0t (oktal) oder das Präfix 0y (binär) angeben. Hinweis Der Standardmäßige Radix verhält sich anders, wenn Sie C++-Ausdrücke verwenden. Weitere Informationen zu diesen Ausdrücken und dem Radix finden Sie unter Auswerten von Ausdrücken.

  • Sie müssen ASCII-Zeichen in einfache gerade Anführungszeichen einschließen. Sie können keine Escapezeichen im C-Format verwenden (z. B. "\0" oder "\n").

Wenn Sie mehrere Bytes angeben, müssen Sie diese nach Leerzeichen trennen.

Die Befehle s-a und s-u suchen nach angegebenen ASCII- bzw. Unicode-Zeichenfolgen. Diese Zeichenfolgen müssen nicht null-endend sein.

Die Befehle s-sa und s-su suchen nach nicht angegebenen ASCII- und Unicode-Zeichenfolgen. Diese sind nützlich, wenn Sie einen Speicherbereich überprüfen, um festzustellen, ob er druckbare Zeichen enthält. Mit den Flagoptionen können Sie eine Mindestlänge der zu findenden Zeichenfolge angeben.

Beispiel: Mit dem folgenden Befehl werden ASCII-Zeichenfolgen mit der Länge >=3 im Bereich ermittelt, die bei 0000000140000000 beginnen und später 400 Bytes enden.

s-sa 0000000140000000 L400

Mit dem folgenden Befehl werden ASCII-Zeichenfolgen mit der Länge >=4 im Bereich gefunden, die bei 0000000140000000 beginnen und später 400 Bytes enden.

s -[l4]sa 0000000140000000 L400

Der folgende Befehl führt dasselbe aus, beschränkt die Suche jedoch auf schreibbare Speicherbereiche.

s -[wl4]sa 0000000140000000 L400

Der folgende Befehl führt dasselbe aus, zeigt jedoch nur die Adresse der Übereinstimmung anstelle der Adresse und des Werts an.

s -[1wl4]sa 0000000140000000 L400

Der Befehl s-v sucht nach Objekten desselben Datentyps wie das Object-Objekt . Sie können diesen Befehl nur verwenden, wenn das gewünschte Objekt eine C++-Klasse oder ein anderes Objekt ist, das virtuellen Funktionstabellen (Vtables) zugeordnet ist. Der Befehl s-v durchsucht den Bereich Speicherbereich nach den Adressen der Vtables dieser Klasse. Wenn in dieser Klasse mehrere Vtables vorhanden sind, sucht der Suchalgorithmus nach all diesen Zeigerwerten, getrennt durch die richtige Anzahl von Bytes. Wenn Übereinstimmungen gefunden werden, gibt der Debugger die Basisadresse des Objekts und vollständige Informationen zu diesem Objekt zurück, ähnlich der Ausgabe des Befehls dt (Anzeigetyp).

Beispiel: Angenommen, der aktuelle Radix ist 16. Die folgenden drei Befehle führen alle dasselbe aus: Durchsuchen von Speicherspeicherorten 0012FF40 bis 0012FF5F nach "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" 

Diese Befehle suchen jedes Aussehen von "Hello" und geben die Adresse jedes solchen Musters zurück, d. h. die Adresse des Buchstabens "H".

Der Debugger gibt nur Muster zurück, die vollständig im Suchbereich enthalten sind. Überlappende Muster werden ordnungsgemäß gefunden. (Anders ausgedrückt: Das Muster "QQQ" wird dreimal in "QQQQQQ" gefunden.)

Das folgende Beispiel zeigt eine Suche, die den Type-Parameter verwendet. Dieser Befehl durchsucht die Speicherspeicherorte 0012FF40 bis 0012FF5F nach dem Doppelwort "VUTS":

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

Auf Little-Endian-Computern entspricht "VUTS" dem Bytemuster "S" 'T' 'U' 'V'. Suche nach WORDs, DWORDs und QWORDs geben jedoch nur Ergebnisse zurück, die ordnungsgemäß byte ausgerichtet sind.