WinDbg命令dt的使用

本文详细介绍了在WinDbg调试器中如何使用dt命令来查看和理解各种结构体及变量信息。通过实例展示了dt命令如何揭示不同结构体的布局,包括双向循环链表、PEB结构体和AVL树等,适用于操作系统调试与内核开发。

(不是很全面。可以参考WinDbg的帮助文档。操作系统 win7 32)
dt命令主要用来查看相关的变量,结构体等的信息,它配合一些参数使用可以 获取想要的信息。
使用dt命令查看结构体:

lkd> dt nt!_list_entry  
   +0x000 Flink            : Ptr32 _LIST_ENTRY 
   +0x004 Blink            : Ptr32 _LIST_ENTRY
  这是双向循环链表,它的表项结构有两个成员,类型都是_list_entry指针。 
lkd> dt nt!_peb_ldr_data
   +0x000 Length           : Uint4B
   +0x004 Initialized      : UChar
   +0x008 SsHandle         : Ptr32 Void
   +0x00c InLoadOrderModuleList : _LIST_ENTRY
   +0x014 InMemoryOrderModuleList : _LIST_ENTRY
   +0x01c InInitializationOrderModuleList : _LIST_ENTRY
   +0x024 EntryInProgress  : Ptr32 Void
   +0x028 ShutdownInProgress : UChar
   +0x02c ShutdownThreadId : Ptr32 Void   
  这是peb(process enviroment block 进程环境块)结构体的一个成员,可以看到里面就使用了3个双向循环链表来记录加载的模块信息。 
lkd> dt nt!_mm_avl_table
   +0x000 BalancedRoot     : _MMADDRESS_NODE
   +0x014 DepthOfTree      : Pos 0, 5 Bits
   +0x014 Unused           : Pos 5, 3 Bits
   +0x014 NumberGenericTableElements : Pos 8, 24 Bits
   +0x018 NodeHint         : Ptr32 Void
   +0x01c NodeFreeHint     : Ptr32 Void
lkd> dt nt!_mmaddress_node
   +0x000 u1               : <unnamed-tag>
   +0x004 LeftChild        : Ptr32 _MMADDRESS_NODE
   +0x008 RightChild       : Ptr32 _MMADDRESS_NODE
   +0x00c StartingVpn      : Uint4B
   +0x010 EndingVpn        : Uint4B  
   avl树在内存的管理(mm--memory management)是被使用。

dt struct addr 来列出具体结构struct的给成员的值

lkd> dt nt!_kprocess 83864d40 
   +0x000 Header           : _DISPATCHER_HEADER
   +0x010 ProfileListHead  : _LIST_ENTRY [ 0x83864d50 - 0x83864d50 ]
   +0x018 DirectoryTableBase : 0x89233480
   +0x01c LdtDescriptor    : _KGDTENTRY
   +0x024 Int21Descriptor  : _KIDTENTRY
   +0x02c ThreadListHead   : _LIST_ENTRY [ 0x83864c38 - 0x88fbca30 ]
   +0x034 ProcessLock      : 0
   +0x038 Affinity         : _KAFFINITY_EX
   +0x044 ReadyListHead    : _LIST_ENTRY [ 0x83864d84 - 0x83864d84 ]
   +0x04c SwapListEntry    : _SINGLE_LIST_ENTRY
   +0x050 ActiveProcessors : _KAFFINITY_EX
   .......(还有没截下来的)  
   _kprocess结构里包含有结构体,那些部分没有给出值,可以加上-b 参数来展开那些结构体,如(dt nt!_kprocess -b 83864d40)。  
lkd> dt nt!_eprocess -l ActiveProcessLinks.Flink -y Ima -yoi Uni 83864d40   
    ActiveProcessLinks.Flink at 0x83864d40
---------------------------------------------
UniqueProcessId : 0x00000ac0 Void
ActiveProcessLinks :  [ 0x838cc0e8 - 0x8385fd00 ]
ImageFileName : [15]  "DrClient.exe"
ImagePathHash : 0x66151206
ImageNotifyDone : 0y1   
  -l参数来列出ActiveProcessLinks.Flink链表里的每一个表向项;-y表明下一个参数的名字的开始,(ImageFileName,ImagePathHash都是以Ima开头);-yoiy,o,i三个选项的组合,o表示省略结构域的偏移量,i表示不缩进子类型。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值