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

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

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

Параметры

Выражение

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

-g

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

Выбор имени столбца (где есть доступная ссылка DML) будет отсортирован по такому столбцу. Если этот столбец уже отсортирован по указанному столбцу, порядок сортировки будет инвертирован.

Любой объект, который является итерируемым, будет иметь пункт контекстного меню выбора и удержания (или щелкните правой кнопкой мыши), добавленный через DML с именем Display as Grid. Выбор и удержание объекта (или щелчка правой кнопкой мыши) в окне вывода и выбор этого объекта будет отображаться в представлении сетки вместо стандартного представления дерева.

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

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

-gc #

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

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

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

-v

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

-r#

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

[<,FormatSpecifier>]

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

Спецификатор формата Description
,x Отображение порядковых порядков в шестнадцатеричном формате
,d Отображение порядковых порядков в десятичном разряде
,o Отображение порядковых порядков в восьмерике
,b Отображение порядковых порядков в двоичном файле
эн Отображение перечислений только по имени (без значения)
,c Отображение в виде одного символа (а не строки)
,s Отображение 8-разрядных строк в кавычках ASCII
,sb Отображение 8-разрядных строк в виде неквалированных ASCII
,s8 Отображение 8-разрядных строк в кавычках UTF-8
,s8b Отображение 8-разрядных строк в формате UTF-8 без параметров
Су Отображение 16-разрядных строк в кавычках UTF-16
суб Отображение 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.Session с параметром рекурсии -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   [Categorized 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
        ...

Объект Kernel 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