dx (отображение выражения объектной модели отладчика)

Команда dx отображает выражение C++ с помощью модели расширения NatVis. Дополнительные сведения о NatVis см. в разделе Создание пользовательских представлений собственных объектов.

dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,<FormatSpecifier> ]
dx [{-?}|{-h}]

Параметры

Выражение

Отображаемое выражение C++.

-g

Отображается в виде объектов сетки данных, которые являются итерируемыми. Каждый итерированный элемент — это строка в сетке, а каждый отображаемый дочерний элемент этих элементов — это столбец. Это позволяет просматривать такие элементы, как массив структур, где каждый элемент массива отображается в строке, а каждое поле структуры — в столбце.

При выборе имени столбца (при наличии доступной ссылки DML) будет сортировка по столбцу. Если сортировка уже отсортирована по столбцу, порядок сортировки будет инвертирован.

Любой объект, который является итерируемым, будет иметь элемент контекстного меню select и hold (или щелкнуть правой кнопкой мыши), добавленный с помощью DML под названием "Отобразить как сетку". При выборе и удержании (или щелчке правой кнопкой мыши) объекта в окне вывода объект будет отображаться в представлении сетки, а не в стандартном представлении дерева.

Элемент (+), отображаемый именем столбца, обеспечивает как выбор и удержание (или щелчок правой кнопкой мыши), так и поведение выбора.

  • Select принимает этот столбец и преобразует его в собственную таблицу. Вы увидите исходные строки и дочерние элементы развернутого столбца.
  • Выбор и удержание (или щелчок правой кнопкой мыши) предоставляет команду "Развернуть в сетку", которая принимает столбец и добавляет его обратно в текущую таблицу как правое большинство столбцов.

-Gc #

Отображение в виде сетки и ограничение размеров ячеек сетки указанным количеством символов (#).

-c # Отображает продолжение контейнера (пропуск элементов контейнера ). Этот параметр обычно используется в сценариях автоматизации пользовательских выходных данных и предоставляет "..." Элемент continuation в нижней части списка.

-N Данные можно отрисовыть двумя способами. Использование визуализации NatVis (по умолчанию) или базовых собственных структур C/C++. Укажите параметр -n для отрисовки выходных данных с использованием только собственных структур C/C++, а не визуализаций NatVis.

-v

Отображение подробных сведений, включая методы и другие нестандартные объекты.

-R#

Рекурсивное отображение подтипов (полей) до # уровней. Если # параметр не указан, по умолчанию используется уровень рекурсии , равный 1.

[<,FormatSpecifier>]

Используйте любой из следующих описателей формата, чтобы изменить отрисовку по умолчанию.

Спецификатор формата Описание
X Отображение порядковых номеров в шестнадцатеричном формате
D Отображение порядковых номеров в десятичном формате
O Порядковый номер в восьмерике
B Отображение порядковых номеров в двоичном формате
En Отображение перечислений только по имени (без значения)
C Отображение в виде одного символа (не строки)
, s Отображение 8-разрядных строк в виде кавычек ASCII
Sb Отображение 8-разрядных строк в виде ASCII без кметок
,s8 Отображение 8-разрядных строк в кавычках UTF-8
, s8b Отображение 8-разрядных строк в формате UTF-8 без кавов
Су Отображение 16-разрядных строк в виде кавычек UTF-16
Sub Отображение 16-разрядных строк в формате UTF-16 unqouted
,! Отображение объектов только в необработанном режиме (например, без NatVis)
,# Укажите длину указателя, массива или контейнера в качестве литерального значения # (замените числовой).
, [<выражение>] Укажите длину указателя, массива или контейнера в качестве выражения выражения <>
Nd Не ищите производный тип (runtype) объекта. Отображение только статического значения

dx-?

Отображение справки из командной строки.

dx-h Отображает справку по объектам, доступным в отладчике.

dx-id

Только для внутреннего использования в корпорации Майкрософт. Используется для переходов по ссылкам модели данных в выходных данных команды.

Пример использования командной строки

Команду .dx settings можно использовать для отображения сведений об объекте параметров отладки. Дополнительные сведения об объектах параметров отладки см. в разделе .settings.

kd> dx -r1 Debugger.Settings
Debugger.Settings  
    Debug            
    Display           
    EngineInitialization 
    Extensions       
    Input             
    Sources           
    Symbols           
    AutoSaveSettings : false

Используйте параметр рекурсии -r1 для просмотра других объектов отладчика : Сеансы, Параметры и Состояние.

kd> dx -r1 Debugger
Debugger  
  Sessions  
  Settings 
  State    
  Utility
  LastEvent 

Укажите объект Debugger.Sessions с параметром рекурсии -r3 для дальнейшего перемещения по цепочке объектов.

kd> dx -r3 Debugger.Sessions
Debugger.Sessions  
  [0]              : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
    Processes  
      [0]              : <Unknown Image>
      [4]              : <Unknown Image>
      [304]            : smss.exe
      [388]            : csrss.exe
      [456]            : wininit.exe
      [468]            : csrss.exe
      [528]            : services.exe
      [536]            : lsass.exe
      [544]            : winlogon.exe
      [620]            : svchost.exe
       ...               ...

Добавьте описатель формата x для отображения порядковых значений в шестнадцатеричном формате.

kd> dx -r3 Debugger.Sessions,x
Debugger.Sessions,x  
  [0x0]            : Remote KD: KdSrv:Server=@{<Local>},Trans=@{1394:Channel=0}
    Processes  
      [0x0]            : <Unknown Image>
      [0x4]            : <Unknown Image>
      [0x130]          : smss.exe
      [0x184]          : csrss.exe
      [0x1c8]          : wininit.exe
      [0x1d4]          : csrss.exe
      [0x210]          : services.exe
      [0x218]          : lsass.exe
      [0x220]          : winlogon.exe
      [0x26c]          : svchost.exe
      [0x298]          : svchost.exe
      [0x308]          : dwm.exe
      [0x34c]          : nvvsvc.exe
      [0x37c]          : nvvsvc.exe
      [0x384]          : svchost.exe
       ...               ...

В этом примере используется активный сеанс отладки для вывода списка стека вызовов первого потока в первом процессе.

kd> dx -r1 Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames
Debugger.Sessions.First().Processes.First().Threads.First().Stack.Frames 
    [0x0]            : nt!RtlpBreakWithStatusInstruction
    [0x1]            : nt!KdCheckForDebugBreak + 0x7a006
    [0x2]            : nt!KiUpdateRunTime + 0x42
    [0x3]            : nt!KiUpdateTime + 0x129
    [0x4]            : nt!KeClockInterruptNotify + 0x1c3
    [0x5]            : hal!HalpTimerClockInterruptEpilogCommon + 0xa
    [0x6]            : hal!HalpTimerClockInterruptCommon + 0x3e
    [0x7]            : hal!HalpTimerClockInterrupt + 0x1cb
    [0x8]            : nt!KiIdleLoop + 0x1a

Используйте параметр -g для отображения выходных данных в виде сетки данных. Выберите столбец для сортировки.

kd> dx -g @$curprocess.Modules

Снимок экрана: выходные данные из команды dx -g @$curprocess.modules, отображающие выходные данные сетки столбцов.

Используйте параметр -h для отображения сведений об объектах.

kd>  dx -h Debugger.State
Debugger.State   [State pertaining to the current execution of the debugger (e.g.: user variables)]
    DebuggerVariables [Debugger variables which are owned by the debugger and can be referenced by a pseudo-register prefix of @$]
    PseudoRegisters   [Categorizied debugger managed pseudo-registers which can be referenced by a pseudo-register prefix of @$]
    UserVariables     [User variables which are maintained by the debugger and can be referenced by a pseudo-register prefix of @$]

Отображение сведений о TEB и PEB с помощью объекта Environment

Используйте объект Environment для отображения сведений о TEB и PEB, связанных с потоком и процессом.

Чтобы отобразить TEB, связанный с текущим потоком, используйте эту команду.

0: kd> dx -r2 @$curthread.Environment
@$curthread.Environment                
    EnvironmentBlock [Type: _TEB]
        [+0x000] NtTib            [Type: _NT_TIB]
        [+0x038] EnvironmentPointer : Unable to read memory at Address 0x38
        [+0x040] ClientId         [Type: _CLIENT_ID]
        [+0x050] ActiveRpcHandle  : Unable to read memory at Address 0x50
        [+0x058] ThreadLocalStoragePointer : Unable to read memory at Address 0x58
        [+0x060] ProcessEnvironmentBlock : Unable to read memory at Address 0x60
        [+0x068] LastErrorValue   : Unable to read memory at Address 0x68
        [+0x06c] CountOfOwnedCriticalSections : Unable to read memory at Address 0x6c
        [+0x070] CsrClientThread  : Unable to read memory at Address 0x70
        [+0x078] Win32ThreadInfo  : Unable to read memory at Address 0x78
        [+0x080] User32Reserved   [Type: unsigned long [26]]
        [+0x0e8] UserReserved     [Type: unsigned long [5]]
        [+0x100] WOW32Reserved    : Unable to read memory at Address 0x100
        [+0x108] CurrentLocale    : Unable to read memory at Address 0x108
        [+0x10c] FpSoftwareStatusRegister : Unable to read memory at Address 0x10c
         ...

Для отображения PEB, связанного с текущим процессом, используйте эту команду.

0: kd> dx -r2 @$curprocess.Environment
@$curprocess.Environment                
    EnvironmentBlock [Type: _PEB]
        [+0x000] InheritedAddressSpace : Unable to read memory at Address 0x0
        [+0x001] ReadImageFileExecOptions : Unable to read memory at Address 0x1
        [+0x002] BeingDebugged    : Unable to read memory at Address 0x2
        [+0x003] BitField         : Unable to read memory at Address 0x3
        [+0x003 ( 0: 0)] ImageUsesLargePages : Unable to read memory at Address 0x3
        [+0x003 ( 1: 1)] IsProtectedProcess : Unable to read memory at Address 0x3
        [+0x003 ( 2: 2)] IsImageDynamicallyRelocated : Unable to read memory at Address 0x3
        [+0x003 ( 3: 3)] SkipPatchingUser32Forwarders : Unable to read memory at Address 0x3
        [+0x003 ( 4: 4)] IsPackagedProcess : Unable to read memory at Address 0x3
        [+0x003 ( 5: 5)] IsAppContainer   : Unable to read memory at Address 0x3
        [+0x003 ( 6: 6)] IsProtectedProcessLight : Unable to read memory at Address 0x3
        [+0x003 ( 7: 7)] IsLongPathAwareProcess : Unable to read memory at Address 0x3
        [+0x004] Padding0         [Type: unsigned char [4]]
        [+0x008] Mutant           : Unable to read memory at Address 0x8
        [+0x010] ImageBaseAddress : Unable to read memory at Address 0x10
        [+0x018] Ldr              : Unable to read memory at Address 0x18
        [+0x020] ProcessParameters : Unable to read memory at Address 0x20
        ...

Объект Io.Handles ядра

Используйте объект Io.Handles текущего процесса для отображения сведений о дескрипторов ядра.

0: kd> dx -r1 @$curprocess.Io.Handles
@$curprocess.Io.Handles                
    [0x8]           
    [0xc]           
    [0x10]          
    [0x14]          
    [0x18]       
    ...

Используйте . Функция First() для отображения сведений о первом дескрипторове.

0: kd> dx -r2 @$curprocess.Io.Handles.First()
@$curprocess.Io.Handles.First()                
    Handle           : 0x8
    Type             : Unexpected failure to dereference object
    GrantedAccess    : Unexpected failure to dereference object
    Object           [Type: _OBJECT_HEADER]
        [+0x000] PointerCount     : 228806 [Type: __int64]
        [+0x008] HandleCount      : 6 [Type: __int64]
        [+0x008] NextToFree       : 0x6 [Type: void *]
        [+0x010] Lock             [Type: _EX_PUSH_LOCK]
        [+0x018] TypeIndex        : 0xf2 [Type: unsigned char]
        [+0x019] TraceFlags       : 0x0 [Type: unsigned char]
        [+0x019 ( 0: 0)] DbgRefTrace      : 0x0 [Type: unsigned char]
        [+0x019 ( 1: 1)] DbgTracePermanent : 0x0 [Type: unsigned char]
        [+0x01a] InfoMask         : 0x0 [Type: unsigned char]
        [+0x01b] Flags            : 0x2 [Type: unsigned char]
        [+0x01b ( 0: 0)] NewObject        : 0x0 [Type: unsigned char]
        [+0x01b ( 1: 1)] KernelObject     : 0x1 [Type: unsigned char]
        [+0x01b ( 2: 2)] KernelOnlyAccess : 0x0 [Type: unsigned char]
        [+0x01b ( 3: 3)] ExclusiveObject  : 0x0 [Type: unsigned char]
        [+0x01b ( 4: 4)] PermanentObject  : 0x0 [Type: unsigned char]
        [+0x01b ( 5: 5)] DefaultSecurityQuota : 0x0 [Type: unsigned char]
        [+0x01b ( 6: 6)] SingleHandleEntry : 0x0 [Type: unsigned char]
        [+0x01b ( 7: 7)] DeletedInline    : 0x0 [Type: unsigned char]
        [+0x01c] Reserved         : 0x0 [Type: unsigned long]
        [+0x020] ObjectCreateInfo : 0xfffff801f6d9c6c0 [Type: _OBJECT_CREATE_INFORMATION *]
        [+0x020] QuotaBlockCharged : 0xfffff801f6d9c6c0 [Type: void *]
        [+0x028] SecurityDescriptor : 0xffffb984aa815d06 [Type: void *]
        [+0x030] Body             [Type: _QUAD]
        ObjectType       : Unexpected failure to dereference object
        UnderlyingObject : Unexpected failure to dereference object

Обратите внимание, что объект Io.Handles является объектом только ядра.

Обход ограничений файла символов с помощью приведения

При отображении сведений о различных системных переменных Windows бывают случаи, когда не все сведения о типе доступны в открытых символах. Этот пример иллюстрирует эту ситуацию.

0: kd> dx nt!PsIdleProcess
Error: No type (or void) for object at Address 0xfffff800e1d50128

Команда dx поддерживает возможность ссылаться на адрес переменной, которая не содержит сведений о типе. Такие ссылки на "адрес" обрабатываются как "void *" и могут быть приведены как таковые. Это означает, что если тип данных известен, для отображения сведений о типе для переменной можно использовать следующий синтаксис.

dx (Datatype *)&VariableName

Например, для nt! PsIdleProcess с типом данных nt!_EPROCESS используйте эту команду.

dx (nt!_EPROCESS *)&nt!PsIdleProcess
(nt!_EPROCESS *)&nt!PsIdleProcess                 : 0xfffff800e1d50128 [Type: _EPROCESS *]
    [+0x000] Pcb              [Type: _KPROCESS]
    [+0x2c8] ProcessLock      [Type: _EX_PUSH_LOCK]
    [+0x2d0] CreateTime       : {4160749568} [Type: _LARGE_INTEGER]
    [+0x2d8] RundownProtect   [Type: _EX_RUNDOWN_REF]
    [+0x2e0] UniqueProcessId  : 0x1000 [Type: void *]
    [+0x2e8] ActiveProcessLinks [Type: _LIST_ENTRY]
    [+0x2f8] Flags2           : 0x218230 [Type: unsigned long]
    [+0x2f8 ( 0: 0)] JobNotReallyActive : 0x0 [Type: unsigned long]

Команда dx не поддерживает переключение оценщиков выражений с помощью синтаксиса @@ MASM. Дополнительные сведения об вычислителях выражений см. в разделе Вычисление выражений.

Использование LINQ с объектами отладчика

Синтаксис LINQ можно использовать с объектами отладчика для поиска данных и управления ими. LINQ концептуально похож на язык SQL (SQL), который используется для запросов к базам данных. Для поиска, фильтрации и анализа отладочных данных можно использовать несколько методов LINQ. Сведения об использовании LINQ с объектами отладчика см. в разделе Использование LINQ с объектами отладчика.

Использование объектов отладчика с NatVis и JavaScript

Сведения об использовании объектов отладчика с NatVis см. в разделе Собственные объекты отладчика в NatVis.

Сведения об использовании объектов отладчика с JavaScript см. в разделе Собственные объекты отладчика в расширениях JavaScript.

См. также раздел

Использование LINQ с объектами отладчика

Собственные объекты отладчика в NatVis

Собственные объекты отладчика в расширениях JavaScript