分类 调试 下的文章

!teb

简介

!teb扩展显示线程环境块(teb)中信息的格式化视图。

使用形式

!teb [TEB-Address]

参数

  • TEB-Address

    要检查其TEB的线程的十六进制地址。(这不是从线程的内核线程块派生的TEB地址。)如果在用户模式中省略了TEB地址,则使用当前线程的TEB。如果在内核模式下省略,则显示与当前寄存器上下文相对应的TEB。

备注

TEB是Microsoft Windows线程控制结构的用户模式部分。
如果!teb扩展没有参数时,在内核模式下会给您一个错误,您应该使用!process用于确定所需线程的TEB地址。确保您的注册上下文设置为所需的线程,然后使用TEB地址作为!teb的参数。
以下是此命令在用户模式下的输出示例:

0:001> ~
   0  id: 324.458   Suspend: 1 Teb 7ffde000 Unfrozen
.  1  id: 324.48c   Suspend: 1 Teb 7ffdd000 Unfrozen

0:001> !teb 
TEB at 7FFDD000
    ExceptionList:    76ffdc
    Stack Base:       770000
    Stack Limit:      76f000
    SubSystemTib:     0
 FiberData:        1e00
    ArbitraryUser:    0
    Self:             7ffdd000
    EnvironmentPtr:   0
 ClientId:         324.48c
    Real ClientId:    324.48c
    RpcHandle:        0
    Tls Storage:      0
    PEB Address:      7ffdf000
    LastErrorValue:   0
    LastStatusValue:  0
    Count Owned Locks:0
    HardErrorsMode:   0

前面有两个随笔介绍了这两个异常(《异常STATUS_INVALID_PARAMETER(0xC000000D)》和《关于异常STATUS_INVALID_CRUNTIME_PARAMETER(0xC0000417)》),它们都是参数无效的异常,但针对的对象不一样。STATUS_INVALID_CRUNTIME_PARAMETER从这个命名来看,就是针对C/C++运行时库库函数的参数校验的,而STATUS_INVALID_PARAMETER是针对Windows系统服务和内核函数的参数校验。

!heap

简介

!heap扩展显示堆使用信息、控制堆管理器中的断点、检测泄漏的堆块、搜索堆块或显示页堆信息。此扩展支持段堆和NT堆。使用!heap没有参数列出所有堆及其类型的堆。

使用形式

!heap [HeapOptions] [ValidationOptions] [Heap] 
!heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress] 
!heap -B {alloc|realloc|free} [Heap | BreakAddress] 
!heap -l 
!heap -s [SummaryOptions] [StatHeapAddress] 
!heap -i HeapAddress
!heap -x [-v] Address 
!heap -p [PageHeapOptions] 
!heap -srch [Size] Pattern
!heap -flt FilterOptions
!heap -stat [-h Handle [-grp GroupBy [MaxDisplay]]]
!heap [-p] -?
!heap -triage [Handle | Address] 

参数

这些参数适用于Segment和NT堆。

  • -s
    指定正在请求摘要信息。如果省略SummaryOptions和StatHeapAddress,则显示与当前进程关联的所有堆的摘要信息。
  • SummaryOptions
    可以是以下选项的任意组合。SummaryOptions不区分大小写。输入!heap -s -?了解更多信息。
    选项效果

    -v

    验证所有数据块。

    -b BucketSize

    指定存储桶大小。 默认值为1024位。

    -d DumpBlockSize

    指定存储桶大小。

    -a

    转储所有堆块。

    -c

    指定应显示每个块的内容。

  • -triage [Handle |Address]
    使调试器自动搜索进程堆中的失败。如果将堆句柄指定为参数,则检查该堆;否则,将搜索所有堆中包含给定地址的堆,如果找到,则检查该堆。使用-triage是验证低碎片堆(LFH)损坏的唯一方法。
  • -x[-v]
    使调试器搜索包含指定地址的堆块。如果添加了-v,该命令将搜索当前进程的整个虚拟内存空间以查找指向此堆块的指针。
  • -l
    使调试器检测泄漏的堆块。
  • -iAddress-hHeapAddress
    显示有关指定 的信息。
  • Address
    指定要搜索的地址。
  • -?
    在调试器命令窗口中显示此扩展的简短帮助文本。使用!heap -?一般的帮助,而且!heap -p -?页面堆帮助。

这些参数仅适用于NT堆。