!주소

!address 확장은 대상 프로세스 또는 대상 컴퓨터에서 사용하는 메모리에 대한 정보를 표시합니다.

사용자 모드

!address Address
!address -summary 
!address [-f:F1,F2,...] {[-o:{csv | tsv | 1}] | [-c:"Command"]}
!address -? | -help

커널 모드

!address Address 
!address

매개 변수

주소
주소가 포함된 주소 공간의 영역만 표시합니다.

-summary
요약 정보만 표시합니다.

-f:F1, F2, ...
필터 F1, F2 등으로 지정된 영역만 표시합니다.

다음 필터 값은 대상 프로세스에서 사용하는 방식으로 메모리 영역을 지정합니다.

필터 값 표시된 메모리 영역

VAR

사용 중인 지역입니다. 이러한 지역에는 모든 가상 할당 블록, SBH 힙, 사용자 지정 할당자의 메모리 및 다른 분류가 없는 주소 공간의 다른 모든 영역이 포함됩니다.

Free

사용 가능한 메모리입니다. 여기에는 예약되지 않은 모든 메모리가 포함됩니다.

이미지

실행 이미지의 일부인 파일에 매핑되는 메모리입니다.

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 확장의 출력 필드를 나타낼 수 있습니다.

자리 표시자 출력 필드

%1

기본 주소

%2

끝 주소 + 1

3%

지역 크기

%4

Type

5%

State(상태)

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(프로세스 컨텍스트 설정)를 사용하여 지정된 프로세스의 가상 주소 공간을 지정한 경우에도 커널 메모리만 검색합니다. 사용자 모드 에서 !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 주소 값을 사용합니다. 이 주소는 주소 0x75831000 시작하고 주소 0x758f6000 끝나는 메모리 영역에 있음을 보여 줍니다. 지역에 사용 이미지, 형식 MEM_IMAGE, 상태 MEM_COMMIT 및 보호 PAGE_EXECUTE_READ 있습니다. (이러한 값의 의미에 대한 자세한 내용은 이전 테이블을 참조하세요.) 이 디스플레이에는 이 메모리 주소에 대한 자세한 정보를 가져오는 데 사용할 수 있는 세 가지 다른 디버거 명령도 나열됩니다.

주소를 시작하고 해당 주소에 대한 정보를 확인하려는 경우 사용 정보가 가장 중요한 경우가 많습니다. 사용량을 알고 나면 추가 확장을 사용하여 이 메모리에 대해 자세히 알아볼 수 있습니다. 예를 들어 사용량이 힙경우 !heap 확장을 사용하여 자세히 알아볼 수 있습니다.

다음 예제에서는 s(메모리 검색) 명령을 사용하여 이미지 형식의 각 메모리 영역에서 와이드 문자 문자열 "참고"를 검색합니다.

!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), 프로세스 ID(0x324) 및 스레드 ID(0x368)의 주소를 표시합니다.