!位址
!address 延伸模組會顯示目標進程或目標計算機所使用的記憶體相關信息。
使用者模式
!address Address
!address -summary
!address [-f:F1,F2,...] {[-o:{csv | tsv | 1}] | [-c:"Command"]}
!address -? | -help
內核模式
!address Address
!address
參數
位址
只顯示包含 Address 的位址空間區域。
-總結
只顯示摘要資訊。
-f:F1、F2、...
只顯示篩選 F1、 F2 等所指定的區域。
下列篩選值會使用目標進程的方式指定記憶體區域。
篩選值 | 顯示的記憶體區域 |
---|---|
VAR |
忙碌區域。 這些區域包括所有虛擬配置區塊、SBH 堆積、來自自定義配置器的記憶體,以及不屬於其他分類之位址空間的所有其他區域。 |
免費 |
釋放記憶體。 這包括尚未保留的所有記憶體。 |
映像 |
對應至屬於可執行映像一部分之檔案的記憶體。 |
Stack |
用於線程堆疊的記憶體。 |
Teb |
用於線程環境區塊的記憶體(TEB)。 |
Peb |
用於進程環境區塊的記憶體(PEB)。 |
堆積 |
用於堆積的記憶體。 |
PageHeap |
用於完整頁面堆積的記憶體區域。 |
CSR |
CSR 共用記憶體。 |
Actx |
用於啟用內容數據的記憶體。 |
NLS |
用於國家語言支援 (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 extension 的輸出字段。
預留位置 | 輸出欄位 |
---|---|
%1 |
基位址 |
2% |
結束位址 + 1 |
3% |
區域大小 |
4% |
類型 |
5% |
州/省 |
6% |
保護 |
7% |
使用方式 |
例如,!address -f:Heap -c:".echo %1 %3 %5"
顯示堆積類型之每個記憶體區域的基位址、大小和狀態。
命令中的引號前面必須加上反斜線 (\)。 例如,!address -f:Heap -c:“s -a %1 %2 \”pad\“” 會搜尋堆積類型 堆積 的每個記憶體區域,以尋找字元串 “pad”。
不支援以分號分隔的多個命令。
-?
在 [調試程式命令] 視窗中顯示此延伸模組的最小說明文字。
DLL
Ext.dll
其他資訊
如需如何顯示和搜尋記憶體的詳細資訊,請參閱 讀取和寫入記憶體。 如需顯示記憶體屬性的其他延伸模組,請參閱 !vm (核心模式) 和 !vprot (使用者模式)。
備註
如果沒有任何參數, !address 擴充功能會顯示整個位址空間的相關信息。 !address -summary 命令只會顯示摘要。
在核心模式中,此延伸模組只會搜尋核心記憶體,即使您使用 .process (Set Process Context) 來指定指定的進程虛擬位址空間也一樣。 在使用者模式中 ,!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結尾。 區域具有使用量 映像、類型 MEM_IMAGE、狀態 MEM_COMMIT和保護 PAGE_EXECUTE_READ。 (如需這些值意義的詳細資訊,請參閱先前的數據表。此顯示也會列出其他三個調試程式命令,您可以用來取得此記憶體位址的詳細資訊。
如果您從地址開始,並嘗試判斷其相關信息,則使用方式資訊通常最有價值。 瞭解使用量之後,您可以使用其他擴充功能來深入瞭解此記憶體。 例如,如果使用量是堆積,您可以使用 !heap 擴充功能來深入瞭解。
下列範例會使用 s (Search Memory) 命令來搜尋 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
「使用方式」的意義與在使用者模式中相同。 “ImageName” 表示與此地址相關聯的模組。 “KernelStack” 會顯示此線程的 ETHREAD 區塊 (0x817B4DA0)、進程標識碼 (0x324) 和線程標識碼 (0x368) 的位址。