!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, ...
フィルター F1F2 などで指定された領域のみを表示します。

次のフィルター値は、ターゲット プロセスがメモリ領域を使用する方法によってメモリ領域を指定します。

フィルター値 表示されるメモリ領域

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) を示します。