dt(표시 형식)
dt 명령은 지역 변수, 전역 변수 또는 데이터 형식에 대한 정보를 표시합니다. 이렇게 하면 구조체 및 공용 구조체뿐만 아니라 간단한 데이터 형식에 대한 정보가 표시할 수 있습니다.
사용자 모드 구문
dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
커널 모드 구문
[Processor] dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
매개 변수
프로세서
필요한 정보를 포함하는 프로세스를 실행하는 프로세서를 지정합니다. 자세한 내용은 다중 프로세서 구문을 참조 하세요. 프로세서는 커널 모드에서만 지정할 수 있습니다.
DisplayOpts
다음 표에 제공된 옵션 중 하나 이상을 지정합니다. 이러한 옵션 앞에 하이픈이 표시됩니다.
옵션 | 설명 |
---|---|
-a[quantity] |
인덱스가 있는 새 줄에 각 배열 요소를 표시합니다. 총 수량 요소가 표시됩니다. a와 수량 사이에 공백이 없어야 합니다. -a 뒤에 숫자가 없으면 배열의 모든 항목이 표시됩니다. -a[quantity] 스위치는 이러한 방식으로 표시하려는 각 형식 이름 또는 필드 이름 바로 앞에 나타나야 합니다. |
-b |
블록을 재귀적으로 표시합니다. 표시된 구조체에 하위 구조체가 포함된 경우 임의 깊이로 재귀적으로 확장되고 전체로 표시됩니다. 포인터는 하위 구조가 아닌 원래 구조에 있는 경우에만 확장됩니다. |
-c |
압축 출력. 가능한 경우 모든 필드가 한 줄에 표시됩니다. (-a 스위치와 함께 사용할 경우 각 배열 요소는 여러 줄 블록으로 서식이 지정되지 않고 한 줄을 사용합니다.) |
-d |
별표로 끝나는 Name과 함께 사용하면 Name으로 시작하는 모든 형식에 대한 자세한 정보 출력을 표시합니다. 이름이 별표로 끝나지 않으면 자세한 정보 표시 출력을 표시합니다. |
-e |
dt 가 강제로 형식을 열거합니다. 이 옵션은 dt가 실수로 Name 값을 형식이 아닌 인스턴스로 해석하는 경우에만 필요합니다. |
-i |
하위 형식을 들여쓰지 마세요. |
-o |
구조체 필드의 오프셋 값을 생략합니다. |
-p |
주소 는 가상 주소가 아닌 실제 주소입니다. |
-r[depth] |
하위 형식 필드를 재귀적으로 덤프합니다. 깊이가 지정되면 깊이 수준 이후에 이 재귀가 중지됩니다. 깊이는 1에서 9 사이의 숫자여야 하며 r과 깊이 사이에 공백이 없어야 합니다. -r[depth] 스위치는 주소 바로 앞에 나타나야 합니다. |
-s 크기 |
크기(바이트)가 크기 값 과 같은 형식만 열거합니다. -s 옵션은 형식이 열거되는 경우에만 유용합니다. -s를 지정하면 -e도 항상 암시됩니다. |
-t |
형식만 열거합니다. |
-v |
자세한 정보 출력. 이렇게 하면 구조체의 총 크기 및 해당 요소의 수와 같은 추가 정보가 표시됩니다. -y 검색 옵션과 함께 사용하면 모든 기호가 표시되며, 연결된 형식 정보가 없는 기호도 표시됩니다. |
SearchOpts
다음 표에 제공된 옵션 중 하나 이상을 지정합니다. 이러한 옵션 앞에 하이픈이 표시됩니다.
옵션 | 설명 |
---|---|
-n |
이는 다음 매개 변수가 이름임을 나타냅니다. 다음 항목이 완전히 16진수 문자로 구성된 경우 이 값을 사용해야 합니다. 그렇지 않으면 주소로 사용되기 때문입니다. |
-y |
이는 다음 매개 변수가 전체 이름이 아니라 이름의 시작임을 나타냅니다. -y가 포함되면 모든 일치 항목이 나열되고 목록의 첫 번째 일치 항목에 대한 자세한 정보가 표시됩니다. -y가 포함되지 않은 경우 정확한 일치 항목만 표시됩니다. |
모듈
이 구조를 정의하는 모듈을 지정하는 선택적 매개 변수입니다. 전역 변수 또는 형식과 이름이 같은 지역 변수 또는 형식이 있는 경우 전역 변수를 의미하도록 지정하는 모듈을 포함해야 합니다. 그렇지 않으면 지역 변수가 대/소문자를 구분하지 않는 일치이고 전역 변수가 대/소문자를 구분하는 일치인 경우에도 dt 명령은 지역 변수를 표시합니다.
이름
형식 또는 전역 변수의 이름을 지정합니다. 이름이 별표(*)로 끝나는 경우 모든 일치 항목 목록이 표시됩니다. 따라서 dt A\*는 "A"로 시작하는 모든 데이터 형식, 전역 및 정적을 나열하지만 이러한 형식의 실제 인스턴스는 표시하지 않습니다. -v 표시 옵션을 동시에 사용하는 경우 연결된 형식 정보가 있는 기호뿐만 아니라 모든 기호가 표시됩니다. Name을 마침표(.)로 바꿔 가장 최근에 사용한 Name 값을 반복할 수도 있습니다.
Name에 공백이 포함되어 있으면 괄호로 묶어야 합니다.
밭
표시할 필드를 지정합니다. 필드를 생략하면 모든 필드가 표시됩니다. 필드 뒤에 마침표(.)가 오는 경우 이 필드의 첫 번째 수준 하위 필드도 표시됩니다. 필드 뒤에 일련의 마침표가 있으면 하위 필드가 마침표 수와 같은 깊이로 표시됩니다. 마침표 뒤에 오는 모든 필드 이름은 -y 검색 옵션이 사용된 것처럼 접두사 일치로 처리됩니다. 필드 뒤에 별표(*)가 있으면 필드의 시작 부분만 처리되고 전체 필드가 아니라 모든 일치하는 필드가 표시됩니다.
주소
표시할 구조체의 주소를 지정합니다. 이름을 생략하면 주소를 포함해야 하며 전역 변수의 주소를 지정해야 합니다. 주소 는 달리 지정하지 않는 한 가상 주소로 간주됩니다. -p 옵션을 사용하여 실제 주소를 지정합니다. "at" 기호( @ )를 사용하여 레지스터를 지정합니다(예: @eax).
목록
연결된 목록을 연결하는 필드 이름을 지정합니다. Address 매개 변수를 포함해야 합니다.
환경
항목 | 설명 |
---|---|
모드 | 사용자 모드, 커널 모드 |
대상 | 라이브, 크래시 덤프 |
플랫폼 | 모두 |
추가 정보
메모리 조작 개요 및 다른 메모리 관련 명령에 대한 설명은 메모리 읽기 및 쓰기를 참조하세요.
설명
dt 명령 출력은 항상 base 10에 부호 있는 숫자와 부호 없는 숫자를 16진수로 표시합니다.
기호 값을 허용하는 dt의 모든 매개 변수는 문자열 와일드카드도 허용합니다. 자세한 내용은 문자열 와일드카드 구문을 참조하세요.
-y 및 -n 옵션은 이름 또는 필드 앞에 올 수 있습니다. -y 옵션을 사용하면 형식 또는 구조체 이름의 시작을 지정할 수 있습니다. 예를 들어 dt -y ALLEN은 ALLENTOWN 형식에 대한 데이터를 표시합니다. 그러나 dt -y A를 사용하여 ALLENTOWN 형식을 표시할 수 없습니다. 대신 A는 유효한 16진수 값이며 -n 옵션 없이 주소로 해석되므로 dt -ny A를 사용해야 합니다.
Name이 구조를 나타내는 경우 모든 필드가 표시됩니다(예: dt myStruct). 특정 필드가 하나만 필요한 경우 myStruct myField를 dt할 수 있습니다. 그러면 C가 myStruct.myField를 호출하는 멤버가 표시됩니다. 그러나 명령 dt myStruct myField1 myField2는 myStruct.myField1 및 myStruct.myField2를 표시합니다. myStruct.myField1.myField2가 표시되지 않습니다.
구조체 이름 또는 필드 뒤에 아래 첨자가 오는 경우 배열의 단일 인스턴스를 지정합니다. 예를 들어 dt myStruct myFieldArray[3] 는 해당 배열의 네 번째 요소를 표시합니다. 그러나 형식 이름 뒤에 아래 첨자가 오는 경우 전체 배열을 지정합니다. 예를 들어 dt CHAR[8] myPtr 은 8자 문자열을 표시합니다. 아래 첨자는 현재 radix에 관계없이 항상 10진수로 사용합니다. 0x 접두사로 인해 오류가 발생합니다.
명령이 .의 형식 정보를 사용하기 때문입니다.pdb 파일은 CPU 플랫폼을 디버그하는 데 자유롭게 사용할 수 있습니다.
dt에서 사용하는 형식 정보에는 모든 Windows 정의 형식을 포함하여 typedef로 만든 모든 형식 이름이 포함됩니다. 예를 들어 부호 없는 long 과 char 는 유효한 형식 이름이 아니지만 ULONG 및 CHAR 는 유효합니다. 모든 Windows 유형 이름의 전체 목록은 Microsoft Windows SDK를 참조하세요.
프로그램에서 실제로 사용된 경우 사용자 고유의 코드 내에서 typedefs로 만든 모든 형식이 존재합니다. 그러나 헤더에 정의되어 있지만 실제로 사용되지 않는 형식은 .pdb 기호 파일에 저장되지 않으며 디버거에서 액세스할 수 없습니다. 디버거에서 이러한 형식을 사용할 수 있도록 하려면 typedef 문의 입력 으로 사용합니다. 예를 들어 코드에 다음이 표시되면 MY_DATA 구조체가 .pdb 기호 파일에 저장되고 dt 명령으로 표시될 수 있습니다.
typedef struct _MY_DATA {
. . .
} MY_DATA;
typedef MY_DATA *PMY_DATA;
반면에 MY_DATA 및 PMY_DATA 모두 초기 typedef에 의해 정의되므로 다음 코드로는 충분하지 않으므로 MY_DATA 형식 정의 문의 입력으로 사용되지 않았습니다.
typedef struct _MY_DATA {
. . .
} MY_DATA, *PMY_DATA;
모든 경우에 형식 정보는 모든 개인 기호 정보가 제거된 기호 파일이 아니라 전체 기호 파일에만 포함됩니다. 자세한 내용은 공용 및 개인 기호를 참조 하세요.
유니코드 문자열을 표시하려면 먼저 .enable_unicode(유니코드 표시 사용) 명령을 사용해야 합니다. .enable_long_status(정 수 표시 사용) 명령을 사용하여 정수의 표시를 제어할 수 있습니다.
다음 예제에서 dt는 전역 변수를 표시합니다.
0:000> dt mt1
+0x000 a : 10
+0x004 b : 98 'b'
+0x006 c : 0xdd
+0x008 d : 0xabcd
+0x00c gn : [6] 0x1
+0x024 ex : 0x0
다음 예제에서 dt는 배열 필드 gn을 표시합니다.
0:000> dt mt1 -a gn
+0x00c gn :
[00] 0x1
[01] 0x2
[02] 0x3
[03] 0x4
[04] 0x5
[05] 0x6
다음 명령은 변수의 일부 하위 필드를 표시합니다.
0:000> dt mcl1 m_t1 dpo
+0x010 dpo : DEEP_ONE
+0x070 m_t1 : MYTYPE1
다음 명령은 필드 m_t1 하위 필드를 표시합니다. 마침표로 인해 자동으로 접두사 일치가 발생하므로 "m_t1"로 시작하는 모든 필드의 하위 필드도 표시됩니다.
0:000> dt mcl1 m_t1.
+0x070 m_t1 :
+0x000 a : 0
+0x004 b : 0 '
+0x006 c : 0x0
+0x008 d : 0x0
+0x00c gn : [6] 0x0
+0x024 ex : 0x0
이 작업은 모든 깊이로 반복할 수 있습니다. 예를 들어 명령 dt mcl1 a.. c. 첫 번째 필드 이름이 a로 시작되고 세 번째 필드 이름이 c로 시작되도록 모든 필드를 깊이 4로 표시합니다.
하위 필드를 표시하는 방법에 대한 자세한 예는 다음과 같습니다. 먼저 Ldr 필드를 표시합니다.
0:000> dt nt!_PEB Ldr 7ffdf000
+0x00c Ldr : 0x00191ea0
이제 포인터 형식 필드를 확장합니다.
0:000> dt nt!_PEB Ldr Ldr. 7ffdf000
+0x00c Ldr : 0x00191ea0
+0x000 Length : 0x28
+0x004 Initialized : 0x1 '
+0x008 SsHandle : (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x191ee0 - 0x192848 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x191ee8 - 0x192850 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x191f58 - 0x192858 ]
+0x024 EntryInProgress : (null)
이제 CriticalSectionTimeout 필드를 표시합니다.
0:000> dt nt!_PEB CriticalSectionTimeout 7ffdf000
+0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
이제 CriticalSectionTimeout 구조 하위 필드를 한 수준 깊이로 확장합니다.
0:000> dt nt!_PEB CriticalSectionTimeout. 7ffdf000
+0x070 CriticalSectionTimeout : 0xffffe86d`079b8000
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 u : __unnamed
+0x000 QuadPart : -25920000000000
이제 CriticalSectionTimeout 구조 하위 필드를 두 수준 깊이로 확장합니다.
0:000> dt nt!_PEB CriticalSectionTimeout.. 7ffdf000
+0x070 CriticalSectionTimeout : 0xffffe86d`079b8000
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 u :
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 QuadPart : -25920000000000
다음 명령은 주소 0x0100297C 있는 데이터 형식 MYTYPE1 인스턴스를 표시합니다.
0:000> dt 0x0100297c MYTYPE1
+0x000 a : 22
+0x004 b : 43 '+'
+0x006 c : 0x0
+0x008 d : 0x0
+0x00c gn : [6] 0x0
+0x024 ex : 0x0
다음 명령은 주소 0x01002BE0 10개의 ULONG 배열을 표시합니다.
0:000> dt -ca10 ULONG 01002be0
[0] 0x1001098
[1] 0x1
[2] 0xdead
[3] 0x7d0
[4] 0x1
[5] 0xcd
[6] 0x0
[7] 0x0
[8] 0x0
[9] 0x0
다음 명령은 다른 주소에서 이전 표시를 계속합니다. "ULONG"을 다시 입력할 필요는 없습니다.
0:000> dt -ca4 . 01002d00
Using sym ULONG
[0] 0x12
[1] 0x4ac
[2] 0xbadfeed
[3] 0x2
다음은 표시 형식의 몇 가지 예입니다. 다음 명령은 이 모듈 의 "MY" 문자열로 시작하는 모든 형식과 전역을 표시합니다. 주소 접두사는 실제 인스턴스입니다. 주소가 없는 항목은 형식 정의입니다.
0:000> dt thismodule!MY*
010029b8 thismodule!myglobal1
01002990 thismodule!myglobal2
thismodule!MYCLASS1
thismodule!MYCLASS2
thismodule!MYCLASS3
thismodule!MYTYPE3::u
thismodule!MYTYPE1
thismodule!MYTYPE3
thismodule!MYTYPE3
thismodule!MYFLAGS
형식 표시를 수행할 때 -v 옵션을 사용하여 각 항목의 크기를 표시할 수 있습니다. -s 크기 옵션은 특정 크기의 항목만 열거하는 데 사용할 수 있습니다. 주소가 접두사로 추가된 인스턴스는 실제 인스턴스입니다. 주소가 없는 항목은 형식 정의입니다.
0:001> dt -s 2 -v thismodule!*
Enumerating symbols matching thismodule!*, Size = 0x2
Address Size Symbol
002 thismodule!wchar_t
002 thismodule!WORD
002 thismodule!USHORT
002 thismodule!SHORT
002 thismodule!u_short
002 thismodule!WCHAR
00427a34 002 thismodule!numberOfShips
00427a32 002 thismodule!numberOfPlanes
00427a30 002 thismodule!totalNumberOfItems
다음은 -b 옵션의 예입니다. 구조체가 확장되고 구조 내의 OwnerThreads 배열이 확장되지만 Flink 및 Blink 목록 포인터는 따르지 않습니다.
kd> dt nt!_ERESOURCE -b 0x8154f040
+0x000 SystemResourcesList : [ 0x815bb388 - 0x816cd478 ]
+0x000 Flink : 0x815bb388
+0x004 Blink : 0x816cd478
+0x008 OwnerTable : (null)
+0x00c ActiveCount : 1
+0x00e Flag : 8
+0x010 SharedWaiters : (null)
+0x014 ExclusiveWaiters : (null)
+0x018 OwnerThreads :
[00]
+0x000 OwnerThread : 0
+0x004 OwnerCount : 0
+0x004 TableSize : 0
[01]
+0x000 OwnerThread : 0x8167f563
+0x004 OwnerCount : 1
+0x004 TableSize : 1
+0x028 ContentionCount : 0
+0x02c NumberOfSharedWaiters : 0
+0x02e NumberOfExclusiveWaiters : 0
+0x030 Address : (null)
+0x030 CreatorBackTraceIndex : 0
+0x034 SpinLock : 0
다음은 커널 모드의 dt 예제입니다. 다음 명령은 !process 0 0과 유사한 결과를 생성합니다.
kd> dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni 814856f0
## ActiveProcessLinks.Flink at 0x814856f0
UniqueProcessId : 0x00000008
ImageFileName : [16] "System"
## ActiveProcessLinks.Flink at 0x8138a030
UniqueProcessId : 0x00000084
ImageFileName : [16] "smss.exe"
## ActiveProcessLinks.Flink at 0x81372368
UniqueProcessId : 0x000000a0
ImageFileName : [16] "csrss.exe"
## ActiveProcessLinks.Flink at 0x81369930
UniqueProcessId : 0x000000b4
ImageFileName : [16] "winlogon.exe"
....
목록의 각 요소에 대한 명령을 실행하려면 !list 확장을 사용합니다.
마지막으로 dt -h 명령은 dt 구문을 요약하는 짧은 도움말 텍스트를 표시합니다.