s (Speicher durchsuchen)

Der Befehl s durchsucht den Speicher, 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 (Aktuelles System festlegen) Befehle.

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. Jede Kennzeichnung ist ein einzelner Buchstabe. Sie müssen die Kennzeichnungen in eine einzelne Gruppe von Klammern ([]) einschließen. Sie können keine Leerzeichen zwischen den Klammern hinzufügen, außer zwischen n oder l und dem Argument. Wenn Sie beispielsweise die Optionen s und w angeben möchten, verwenden Sie den Befehl s -[sw]Type Range Pattern.

Sie können eine 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 aus der letzten gespeicherten Suche ein. Sie können die S - und R-Kennzeichnungen nicht im selben Befehl verwenden. Wenn Sie r verwenden, wird der Wert des Bereichs ignoriert, und der Debugger durchsucht nur die Treffer, die vom vorherigen Befehl gespeichert wurden.

n Treffer
Gibt die Anzahl der zu speichernden Treffer an, wenn Sie das Kennzeichen verwenden . Der Standardwert ist 1024 Treffer. Wenn Sie "n" zusammen mit anderen Flags verwenden, muss n das letzte Kennzeichen sein, gefolgt von dessen Trefferargument. Der Abstand zwischen n und Treffern ist optional, sie können jedoch keine anderen Leerzeichen innerhalb der Klammern hinzufügen. Wenn eine spätere Suche, die das Kennzeichen 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.

l Länge
Bewirkt, dass eine Suche nach beliebigen ASCII- oder Unicode-Zeichenfolgen nur Zeichenfolgen zurückgibt, die mindestens Längenzeichen lang sind. Die Standardlänge ist 3. Dieser Wert wirkt sich nur auf Suchvorgänge aus, die die Flags "-sa " oder "-su " verwenden.

a
Sucht nur schreibbare Speicherbereiche. Sie müssen das "w" in eckige Klammern setzen.

1
Zeigt nur die Adressen der Suchergebnisse in der Suchausgabe an. Diese Option ist nützlich, wenn Sie das FOREACH-Token verwenden, um die Befehlsausgabe in die Eingabe eines anderen Befehls zu übertragen.

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

Typ Beschreibung

b

Byte (8 Bit)

a

WORD (16 Bit)

d

DWORD (32 Bit)

Q

QWORD (64 Bit)

a

ASCII-Zeichenfolge (nicht unbedingt eine mit Null beendete Zeichenfolge)

n

Unicode-Zeichenfolge (nicht unbedingt eine mit Null beendete Zeichenfolge)

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

sa
Sucht nach speicherfähigen ASCII-Zeichenfolgen, die druckbare ASCII-Zeichenfolgen enthalten. Verwenden Sie das L Length-Flag , um eine Mindestlänge solcher Zeichenfolgen anzugeben. Die Standardmäßige Mindestlänge beträgt 3 Zeichen.

Su
Sucht nach speicherfähigen Unicode-Zeichenfolgen, die druckbare Unicode-Zeichenfolgen enthalten. Verwenden Sie das L Length-Flag , um eine Mindestlänge solcher Zeichenfolgen anzugeben. Die Standardmäßige Mindestlänge beträgt 3 Zeichen.

Bereich
Gibt den speicherbereich an, der durchsucht werden soll. 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 sind diese Werte Bytewerte. Sie können verschiedene Speichertypen im Typ angeben. Wenn Sie abhängig von den anderen ausgewählten Optionen einen WORD-, DWORD- oder QWORD-Wert angeben, müssen Sie das Suchmuster möglicherweise in einfache Anführungszeichen (z . B. "H") einschließen.

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 angeben, schließen Sie sie mithilfe des Ascii-Typs 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 Objekt angibt.

Environment

Element Beschreibung
Modi Benutzermodus, Kernel-Modus
Ziele Live, Crash Dump
Plattformen Alle

Zusätzliche Informationen

Weitere Informationen zur Speichermanipulation 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 des Speicherbereichs an, in dem das Muster gefunden wurde. Der Debugger zeigt einen Auszug des Arbeitsspeichers an, der an diesem Speicherort in einem Format beginnt, das dem angegebenen Typ des Arbeitsspeichertyps entspricht. Wenn "Type" ein oder "u" ist, werden der Speicherinhalt und die entsprechenden ASCII- oder Unicode-Zeichen angezeigt.

Sie müssen den Pattern-Parameter als Bytereihe angeben, es sei denn, Sie geben einen anderen Typwert an. Sie können Bytewerte als numerische oder ASCII-Zeichen eingeben:

  • Numerische Werte werden als Zahlen im aktuellen Radix interpretiert (16, 10 oder 8). Verwenden Sie den Befehl n (Zahlenbasis festlegen), um den Standardradiix zu ändern. Sie können die Standardbasis außer Kraft setzen, 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. Beachten Sie, dass sich das Standard-Radix anders verhält, 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 setzen. Escapezeichen im C-Stil können nicht verwendet werden (z. B. "\0" oder "\n").

Wenn Sie mehrere Bytes angeben, müssen Sie sie durch Leerzeichen trennen.

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

Die Befehle "s-sa " und "s-su " suchen nach nicht angegebenen ASCII- und Unicode-Zeichenfolgen. Dies ist nützlich, wenn Sie einen Speicherbereich überprüfen, um festzustellen, ob er druckbare Zeichen enthält. Mit den Flags-Optionen können Sie eine Mindestlänge von Zeichenfolgen angeben, die gesucht werden soll.

Beispiel: Mit dem folgenden Befehl werden ASCII-Zeichenfolgen gefunden, die länge >=3 im Bereich sind, beginnend bei 0000000140000000 und später 400 Bytes enden.

s-sa 0000000140000000 L400

Der folgende Befehl findet ASCII-Zeichenfolgen mit der Länge >=4 im Bereich, die bei 0000000140000000 beginnen und 400 Bytes später enden.

s -[l4]sa 0000000140000000 L400

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

s -[wl4]sa 0000000140000000 L400

Der folgende Befehl führt dieselbe Funktion 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 es sich bei dem gewünschten Objekt um eine C++-Klasse oder ein anderes Objekt handelt, das virtuellen Funktionstabellen (Vtables) zugeordnet ist. Der Befehl "s-v " durchsucht den Bereichsspeicherbereich nach den Adressen der VTables dieser Klasse. Wenn in dieser Klasse mehrere Vtables vorhanden sind, sucht der Suchalgorithmus nach allen 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 jede Darstellung 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 richtig gefunden. (Mit anderen Worten, das Muster "QQQ" wird dreimal in "QQQQQ" gefunden.)

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

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

Auf kleinen Endcomputern ist 'VUTS' identisch mit dem Bytemuster 'S' 'T' 'U' 'V'. Suchvorgänge nach WORDs, DWORDs und QWORDs geben jedoch nur Ergebnisse zurück, die ordnungsgemäß byte ausgerichtet sind.