!address
!address 拡張機能は、ターゲット プロセスまたはターゲット コンピューターが使用するメモリに関する情報を表示します。
ユーザー モード
!address Address
!address -summary
!address [-f:F1,F2,...] {[-o:{csv | tsv | 1}] | [-c:"Command"]}
!address -? | -help
カーネル モード
!address Address
!address
パラメーター
Address
Addressを含むアドレス空間の領域のみを表示します。
-summary
概要情報のみを表示します。
-f:F1, F2, ...
フィルター F1、F2 などで指定された領域のみを表示します。
次のフィルター値は、ターゲット プロセスがメモリ領域を使用する方法によってメモリ領域を指定します。
フィルター値 | 表示されるメモリ領域 |
---|---|
VAR |
ビジー領域。 これらの領域には、すべての仮想割り当てブロック、SBH ヒープ、カスタム アロケーターからのメモリ、および他の分類に該当しないアドレス空間のその他のすべての領域が含まれます。 |
Free |
空きメモリ。 これには、予約されていないすべてのメモリが含まれます。 |
Image |
実行可能イメージの一部であるファイルにマップされたメモリ。 |
Stack |
スレッドスタックに使用されるメモリ。 |
Teb |
スレッド環境ブロック (TEB) に使用されるメモリ。 |
Peb |
プロセス環境ブロック (PEB) に使用されるメモリ。 |
ヒープ |
ヒープに使用されるメモリ。 |
PageHeap |
フルページ ヒープに使用されるメモリ領域。 |
CSR |
CSR 共有メモリ。 |
Actx |
アクティベーション コンテキスト データに使用されるメモリ。 |
NLS |
National Language Support (NLS) テーブルに使用されるメモリ。 |
FileMap |
メモリマップされたファイルに使用されるメモリ。 このフィルターはライブ デバッグ時にのみ適用できます。 |
次のフィルター値は、メモリ タイプごとにメモリ領域を指定します。
フィルター値 | 表示されるメモリ領域 |
---|---|
MEM_IMAGE |
実行可能イメージの一部であるファイルにマップされたメモリ。 |
MEM_MAPPED |
実行可能イメージの一部ではないファイルにマップされているメモリ。 これには、ページング ファイルにマップされたメモリが含まれます。 |
MEM_PRIVATE |
プライベート メモリ。 このメモリは他のプロセスによって共有されず、どのファイルにもマップされません。 |
次のフィルター値は、メモリの状態によってメモリ領域を指定します。
フィルター値 | 表示されるメモリ領域 |
---|---|
MEM_COMMIT |
コミットされたメモリ。 |
MEM_FREE |
空きメモリ。 これには、予約されていないすべてのメモリが含まれます。 |
MEM_RESERVE |
予約済みメモリ。 |
次のフィルター値は、メモリに適用される保護によってメモリ領域を指定します。
フィルター値 | 表示されるメモリ領域 |
---|---|
PAGE_NOACCESS |
アクセスできないメモリ。 |
PAGE_READONLY |
読み取りは可能ですが、書き込みや実行はできないメモリ。 |
PAGE_READWRITE |
読み取りと書き込みは可能ですが、実行はできないメモリ。 |
PAGE_WRITECOPY |
コピーオンライト動作を持つメモリ。 |
PAGE_EXECUTE |
実行可能ですが、読み取りも書き込みもできないメモリ。 |
PAGE_EXECUTE_READ |
実行可能で読み取りは可能ですが、書き込みはできないメモリ。 |
PAGE_EXECUTE_READWRITE |
実行可能、読み取り可能、書き込み可能なメモリ。 |
PAGE_EXECUTE_WRITECOPY |
実行可能で、コピーオンライト動作を持つメモリ。 |
PAGE_GUARD |
ガード ページとして機能するメモリ。 |
PAGE_NOCACHE |
キャッシュされないメモリ。 |
PAGE_WRITECOMBINE |
書き込み結合アクセスが有効になっているメモリ。 |
-o:{csv | tsv | 1}
次のオプションのいずれかに従って出力を表示します。
オプション | 出力書式 |
---|---|
csv |
出力をカンマ区切り値として表示します。 |
tsv |
出力をタブ区切り値として表示します。 |
1 |
出力をベア形式で表示します。 この形式は、!address が .foreach への入力として使用される場合に適切に機能します。 |
-c:"Command"
各メモリ領域に対してカスタム コマンドを実行します。 コマンド内で次のプレースホルダーを使用して、!address 拡張機能の出力フィールドを表すことができます。
プレースホルダー | 出力のフィールド |
---|---|
%1 |
ベース アドレス |
2% |
終了アドレス + 1 |
%3 |
領域サイズ |
4% |
Type |
5% |
都道府県 |
%6 |
保護 |
7% |
使用方法 |
たとえば、!address -f:Heap -c:".echo %1 %3 %5"
は ヒープ型の各メモリ領域のベース アドレス、サイズ、状態を表示します。
コマンド内の引用符の前にはバックスラッシュ (\") を付ける必要があります。 たとえば、!address -f:Heap -c:"s -a %1 %2 \"pad\"" は、Heapタイプの各メモリ領域で文字列「pad」を検索します。
セミコロンで区切られた複数のコマンドはサポートされていません。
-?
この拡張機能の最小限のヘルプ テキストをデバッガー コマンド ウィンドウに表示します。
DLL
Ext.dll
追加情報
メモリの表示および検索方法の詳細については、「メモリの読み取りと書き込み」を参照してください。 メモリのプロパティを表示するその他の拡張機能については、!vm (カーネル モード) および !vprot (ユーザー モード) を参照してください。
解説
パラメータを指定しないと、!address 拡張機能はアドレス空間全体に関する情報を表示します。 !address -summary コマンドは概要のみを表示します。
カーネル モードでは、.process (プロセス コンテキストの設定) を使用して特定のプロセスの仮想アドレス空間を指定した場合でも、この拡張機能はカーネル メモリのみを検索します。 ユーザー モードでは、!address 拡張機能は常にターゲット プロセスが所有するメモリを参照します。
ユーザー モードでは、 !address Address は、指定したアドレスが属するリージョンの特性を示します。 パラメータを指定しないと、!address はすべてのメモリ領域の特性を示します。 これらの特性には、メモリ使用量、メモリ タイプ、メモリ状態、メモリ保護が含まれます。 この情報の意味の詳細については、-f パラメータの説明の前の表を参照してください。
次の例では、!address を使用して、kernel32.dll にマップされているメモリ領域に関する情報を取得します。
0:000> !address 75831234
Usage: Image
Base Address: 75831000
End Address: 758f6000
Region Size: 000c5000
Type: 01000000MEM_IMAGE
State: 00001000MEM_COMMIT
Protect: 00000020PAGE_EXECUTE_READ
More info: lmv m kernel32
More info: !lmi kernel32
More info: ln 0x75831234
この例では、0x75831234 の Address 値を使用しています。 表示には、このアドレスがアドレス 0x75831000 で始まりアドレス 0x758f6000 で終わるメモリ領域内にあることが示されています。 この領域には、使用状況の Image、タイプ MEM_IMAGE、状態 MEM_COMMIT、および保護 PAGE_EXECUTE_READがあります。 (これらの値の意味の詳細については、前の表を参照してください。) 表示には、このメモリ アドレスに関する詳細情報を得るために使用できる他の 3 つのデバッガー コマンドもリストされます。
アドレスから始めて、それに関する情報を判断しようとする場合、多くの場合、使用状況に関する情報が最も価値があります。 使用状況がわかったら、追加の拡張機能を使用して、このメモリについてさらに詳しく知ることができます。 たとえば、使用状況がHeap の場合、!heap 拡張機能を使用して詳細を確認できます。
次の例では、s (メモリ検索) コマンドを使用して、Image 型の各メモリ領域でワイド文字列「Note」を検索します。
!address /f:Image /c:"s -u %1 %2 \"Note\""
*** Executing: s -u 0xab0000 0xab1000 "Note"
*** Executing: s -u 0xab1000 0xabc000 "Note"
00ab2936 004e 006f 0074 0065 0070 0061 0064 0000 N.o.t.e.p.a.d...
00ab2f86 004e 006f 0074 0065 0070 0061 0064 005c N.o.t.e.p.a.d.\.
00ab32e4 004e 006f 0074 0065 0070 0061 0064 0000 N.o.t.e.p.a.d...
*** Executing: s -u 0xabc000 0xabd000 "Note"
. . .
カーネル モードでは、!address の出力はユーザー モードの出力と似ていますが、含まれる情報は少なくなります。 次の例は、カーネル モードの出力を示しています。
kd> !address
804de000 - 00235000
Usage KernelSpaceUsageImage
ImageName ntoskrnl.exe
80c00000 - 001e1000
Usage KernelSpaceUsagePFNDatabase
....
f85b0000 - 00004000
Usage KernelSpaceUsageKernelStack
KernelStack 817b4da0 : 324.368
f880d000 - 073d3000
Usage KernelSpaceUsageNonPagedPoolExpansion
「usage」の意味はユーザーモードと同じです。 「ImageName」は、このアドレスに関連付けられているモジュールを示します。 「KernelStack」は、このスレッドの ETHREAD ブロックのアドレス (0x817B4DA0)、プロセス ID (0x324)、およびスレッド ID (0x368) を示します。