s (メモリの検索)
s コマンドはメモリを検索して特定のバイト パターンを見つけます。
このコマンドを、~s (現在のプロセッサの変更)、~s (現在のスレッドの設定)、|s (現在のプロセスの設定)、または ||s (現在のシステムの設定) コマンドと混同しないでください。
s [-[[Flags]Type]] Range Pattern
s -[[Flags]]v Range Object
s -[[Flags]]sa Range
s -[[Flags]]su Range
パラメーター
[ Flags]
1 つ以上の検索オプションを指定します。 各フラグは単一の文字です。 フラグは 1 組のかっこ ([]) で囲む必要があります。 n または l とその引数の間を除き、括弧の間にスペースを追加することはできません。 たとえば、s および w オプションを指定する場合は、コマンド s -[sw]Type Range Pattern を使用します。
次のフラグを 1 つ以上指定できます。
s
現在の検索結果をすべて保存します。 これらの結果を使用して、後で検索を繰り返すことができます。
r
現在の検索を、最後に保存した検索の結果に制限します。 同じコマンドで s フラグと r フラグを使用することはできません。 r を使用すると、Range の値は無視され、デバッガーは前の s コマンドによって保存されたヒットのみを検索します。
n Hits
s フラグを使用するときに保存するヒット数を指定します。 既定値はヒット数です。 n を他のフラグと一緒に使用する場合、n は最後のフラグであり、その後に Hits 引数が続く必要があります。 n と Hits の間のスペースはオプションですが、括弧内に他のスペースを追加することはできません。 s フラグを使用した後続の検索で、指定された数を超えるヒットが検出された場合は、すべてのヒットが保存されていないことを通知するオーバーフロー エラー メッセージが表示されます。
l Length
任意の ASCII または Unicode 文字列を検索すると、少なくとも Length 文字の長さの文字列のみが返されます。 既定の長さは です。 この値は、-sa または -su フラグを使用する検索にのみ影響します。
w
書き込み可能なメモリ領域のみを検索します。 「w」を括弧で囲む必要があります。
1
検索出力に検索一致のアドレスのみを表示します。 このオプションは、.foreach トークンを使用してコマンド出力を別のコマンドの入力にパイプする場合に便利です。
Type
検索するメモリの種類を指定します。 Type の前にハイフン (-) を追加します。 次の Type 値のいずれかを使用できます。
型 | 説明 |
---|---|
b |
バイト (ビット) |
w |
WORD (ビット) |
d |
DWORD (ビット) |
q |
QWORD (ビット) |
a |
ASCII 文字列 (必ずしも null で終わる文字列であるとは限りません) |
u |
Unicode 文字列 (必ずしも null で終わる文字列であるとは限りません) |
Type を省略した場合は、バイト値が使用されます。 ただし、Flags を使用する場合は、Type を省略できません。
sa
印刷可能な ASCII 文字列を含むメモリを検索します。 このような文字列の最小長を指定するには、 l Length フラグを使用します。 既定の最小長は文字数です。
su
印刷可能な Unicode 文字列を含むメモリを検索します。 このような文字列の最小長を指定するには、 l Length フラグを使用します。 既定の最小長は文字数です。
Range
検索するメモリ領域を指定します。 L? 構文を使用しない限り、この範囲が 256 MB を超えることはできません。 この構文の詳細については、「アドレスとアドレス範囲の構文」を参照してください。
Pattern
検索する 1 つ以上の値を指定します。 既定では、これらの値はバイト値です。 Type にはさまざまなタイプのメモリを指定できます。 WORD、DWORD、または QWORD 値を指定する場合は、選択した他のオプションに応じて、検索パターンを一重引用符 ('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.......`..@....
ASCII タイプを使用して文字列を指定する場合は、文字列を二重引用符で囲みます (たとえば、"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
指定された Object と同じタイプのオブジェクトを検索します。
Object
オブジェクトのアドレス、またはオブジェクトへのポインターのアドレスを指定します。 次に、デバッガーは、Object で指定されたオブジェクトと同じタイプのオブジェクトを検索します。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
追加情報
メモリ操作の概要とその他のメモリ関連のコマンドの説明については、「メモリの読み取りと書き込み」を参照してください。
解説
デバッガーは、指定したバイト パターンを見つけると、パターンが見つかった Range メモリ領域の最初のメモリ アドレスを表示します。 デバッガは、指定された Type メモリ タイプと一致する形式で、その位置から始まるメモリの抜粋を表示します。 Type が a または u の場合、メモリの内容と対応する ASCII 文字または Unicode 文字が表示されます。
別の Type 値を指定しない限り、Pattern パラメーターは一連のバイトとして指定する必要があります。 バイト値は数値または ASCII 文字として入力できます。
数値は、現在の基数 (16、10、または 8) の数値として解釈されます。 デフォルトの基数を変更するには、n (Set Number Base)コマンドを使用する。 0x 接頭辞 (16 進数)、0n 接頭辞 (10 進数)、0t 接頭辞 (8 進数)、または 0y 接頭辞 (2 進数) を指定することで、既定の基数をオーバーライドできます。 注 C++ 式を使用する場合、既定の基数は異なる動作をします。 これらの式と基数の詳細については、「式の評価」を参照してください。
ASCII 文字は一重引用符で囲む必要があります。 C スタイルのエスケープ文字 (「\」や「\n」など) は使用できません。
複数のバイトを指定する場合は、スペースで区切る必要があります。
s-a コマンドと s-u コマンドは、それぞれ指定された ASCII 文字列と Unicode 文字列を検索します。 これらの文字列は NULL で終了する必要はありません。
s-sa および s-su コマンドは、指定されていない ASCII 文字列および Unicode 文字列を検索します。 これらは、メモリの範囲をチェックして印刷可能な文字が含まれているかどうかを確認する場合に便利です。 flags オプションを使用すると、検索する文字列の最小長を指定できます。
例: 次のコマンドは、0000000140000000 で始まり 400 バイト以降で終わる範囲内で長さ >= 3 の ASCII 文字列を検索します。
s-sa 0000000140000000 L400
次のコマンドは、0000000140000000 で始まり 400 バイト以降で終わる範囲で長さが >=4 の ASCII 文字列を検索します。
s -[l4]sa 0000000140000000 L400
次のコマンドは同じことを行いますが、検索を書き込み可能なメモリ領域に限定します。
s -[wl4]sa 0000000140000000 L400
次のコマンドは同じことを行いますが、アドレスと値ではなく、一致したアドレスのみを表示します。
s -[1wl4]sa 0000000140000000 L400
s-v コマンドは、Object オブジェクトと同じデータ型のオブジェクトを検索します。 このコマンドは、目的のオブジェクトが C++ クラスまたは仮想関数テーブル (Vtable) に関連付けられた別のオブジェクトである場合にのみ使用できます。 s-v コマンドは、Range メモリ領域でこのクラスの Vtable のアドレスを検索します。 このクラスに複数の Vtable が存在する場合、検索アルゴリズムは、適切なバイト数で区切られたこれらすべてのポインター値を検索します。 一致するものが見つかった場合、デバッガーは、dt (表示タイプ) コマンドの出力と同様に、オブジェクトのベース アドレスとこのオブジェクトに関する完全な情報を返します。
例: 現在の基数が 16 であると仮定します。 次の 3 つのコマンドはすべて同じことを行います。メモリ位置 0012FF40 ~ 0012FF5F で「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"
これらのコマンドは、「Hello」の出現箇所を特定し、そのような各パターンのアドレス、つまり文字「H」のアドレスを返します。
デバッガーは、検索範囲に完全に含まれるパターンのみを返します。 重複するパターンが正しく検出されます。 (つまり、「QQQQQ」の中に「QQQ」というパターンが 3 回見つかります。)
次の例は、Type パラメーターを使用した検索を示しています。 このコマンドは、メモリ位置 FF から FFF でダブルワード 'VUTS' を検索します。
0:000> s -d 0012ff40 L20 'VUTS'
リトル エンディアン コンピューターでは、「VUTS」はバイト パターン 'S' 'T' 'U' 'V' と同じです。 ただし、WORD、DWORD、および QWORD の検索では、正しくバイトでアラインされた結果のみが返されます。