dx (デバッガー オブジェクト モデル式の表示)

dx コマンドは、NatVis 拡張機能モデルを使用して C++ 式を表示します。 NatVis の詳細については、「ネイティブ オブジェクトのカスタム ビューを作成する」を参照してください。

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

パラメーター

Expression

表示される C++ 式。

-g

反復可能なデータ グリッド オブジェクトとして表示します。 反復される各要素はグリッドの行であり、それらの要素の各表示子は列です。 これにより、構造体の配列などを表示できます。各配列要素は行に表示され、構造体の各フィールドは列に表示されます。

列名を選択すると (使用可能な DML リンクがある場合)、その列で並べ替えられます。 既にその列で並べ替えられている場合、並べ替え順は逆になります。

反復可能なオブジェクトには、DML によって追加された [Display as Grid] (グリッドとして表示) というコンテキスト メニュー項目があります。このメニューはオブジェクトの長押しまたは右クリックで表示されます。 出力ウィンドウでオブジェクトを長押し (または右クリック) してこの項目を選択すると、オブジェクトが標準のツリー ビューではなくグリッド ビューに表示されます。

列名の横に表示される (+) は、長押し (または右クリック) すると、選択操作を行うことができます。

  • 選択操作により、その列が専用の表に展開されます。 元の行と、展開された列の子行が表示されます。
  • 長押し (または右クリック) すると、[Expand Into Grid] (グリッドに展開) が表示され、列が現在の表に最右列として追加されます。

-gc #

グリッドとして表示し、グリッドのセルサイズを指定した文字数 (#) に制限します。

-c # コンテナーの続き要素 (コンテナーの # 個の要素のスキップ) を表示します。このオプションは通常、カスタムの出力自動化シナリオで使用され、リストの最下部に続き要素「…」が追加されます。

n データをレンダリングするには 2 つの方法があります。 NatVis 視覚化を使用する方法 (既定) と、基になるネイティブ C/C++ 構造体を使用する方法です。 NatVis 視覚化を使用せず、ネイティブ C/C++ 構造体のみを使用して出力をレンダリングするには、-n パラメーターを指定します。

-v

メソッドやその他の一般的でないオブジェクトを含む詳細情報を表示します。

-r#

サブタイプ (フィールド) を # レベルまで再帰的に表示します。 # を指定しない場合、再帰レベルは 1 が既定値です。

[<,FormatSpecifier>]

既定のレンダリングを変更するには、次のいずれかの書式指定子を使用します。

書式指定子 説明
,x 16 進数で序数を表示する
,d 10 進数で序数を表示する
,o 8 進数で序数を表示する
,b 2 進数で序数を表示する
,en 列挙型を名前のみで表示する (値なし)
c, 1 文字として表示する (文字列ではない)
,s 8 ビット文字列を ASCII で引用符で囲んで表示する
,sb 8 ビット文字列を ASCII で引用符で囲まないで表示する
,s8 8 ビット文字列を UTF-8 で引用符で囲んで表示する
,s8b 8 ビット文字列を UTF-8 で引用符で囲まないで表示する
,su 16 ビット文字列を UTF-16 で引用符で囲んで表示する
,sub 16 ビット文字列を UTF-16 で引用符で囲まないで表示する
,! オブジェクトを raw モードでのみ表示する (NatVis なしなど)
,# ポインター/配列/コンテナーの長さをリテラル値 # で指定する (数値に置き換える)
,[<expression>] ポインター/配列/コンテナーの長さを式 <expression> として指定する
,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 

-r3 再帰オプションで Debugger.Sessions オブジェクトを指定して、オブジェクト チェーンを下にたどります。

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
       ...               ...

16 進数で序数値を表示するには、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

Screenshot of output from dx -g @$curprocess.modules command, displaying columnar grid output.

-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 @$]

Environment オブジェクトを使用した TEB および PEB 情報の表示

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 *」として扱われ、void * 型にキャストできます。 つまり、データ タイプがわかっていれば、次の構文を使用して変数のタイプ情報を表示できるようになります。

dx (Datatype *)&VariableName

たとえば、データ タイプが nt!_EPROCESS である nt!PsIdleProcess の場合は、このコマンドを使用します。

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 は概念的には、データベースのクエリに使用される Structured Query Language (SQL) に似ています。 さまざまな LINQ メソッドを使用して、デバッグ データを検索、フィルター処理、解析できます。 デバッガー オブジェクトでの LINQ の使用については、「デバッガー オブジェクトでの LINQ の使用」を参照してください。

NatVis および JavaScript でのデバッガー オブジェクトの使用

NatVis でのデバッガー オブジェクトの使用については、「NatVis でのネイティブ デバッガー オブジェクト」を参照してください。

JavaScript でのデバッガー オブジェクトの使用については、「JavaScript 拡張機能でのネイティブ デバッガー オブジェクト」を参照してください。

関連項目

デバッガー オブジェクトでの LINQ の使用

NatVis でのネイティブ デバッガー オブジェクト

JavaScript 拡張機能でのネイティブ デバッガー オブジェクト