分类 调试 下的文章

!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堆。


  • HeapOptions
    可以是以下选项的任意组合。HeapOptions值区分大小写。


    选项效果

    -v

    使调试器验证指定的堆。此选项不会检测到低碎片堆(LFH)损坏。使用-triage代替。

     

    简介

    STATUS_INVALID_CRUNTIME_PARAMETER,值为0xC0000417,又称CRT参数无效异常,其定义如下:

    //
    // MessageId: STATUS_INVALID_CRUNTIME_PARAMETER
    //
    // MessageText:
    //
    // An invalid parameter was passed to a C runtime function.
    //
    #define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417L)    // winnt

    说明

    此异常主要是在CRT的相关库函数对传进来的参数进行有效性检测而引发的。比如指针参数是否为空,缓冲区大小和传入的长度等。一般都是通过_invalid_parameter_noinfo->_invalid_parameter->_invoke_watson->_call_reportfault抛出。

    异常结构填充

    ExceptionAddress: 0f2846a9
    ExceptionCode: 0xC0000417
    ExceptionFlags: 00000001
    NumberParameters:0

    !htrace

    简介

    !htrace扩展显示一个或多个句柄的堆栈跟踪信息。

    使用形式

    • 用户模式
      !htrace[Handle [Max_Traces]]
      !htrace -enable[Max_Traces]
      !htrace -snapshot
      !htrace -diff
      !htrace -disable
      !htrace -?
    • 内核模式
      !htrace[Handle [Process [Max_Traces]]]
    • !htrace -?

    参数

    • Handle
      指定将显示其堆栈跟踪的句柄。如果Handle为0或省略,则将显示进程中所有句柄的堆栈跟踪。
    • Process
      (仅限内核模式)指定将显示其句柄的进程。如果进程为0或省略,则使用当前进程。在用户模式下,始终使用当前进程。
    • Max_Traces
      指定要显示的堆栈跟踪的最大数目。在用户模式下,如果省略此参数,则将显示目标进程的所有堆栈跟踪。
    • -enable
      (仅限用户模式)启用句柄跟踪,并通过-diff选项将句柄信息的第一个快照用作初始状态。
    • -snapshot
      (仅限用户模式)获取当前句柄信息的快照,以用作-diff选项的初始状态。
    • -diff
      (仅限用户模式)将当前句柄信息与上次获取的句柄信息快照进行比较。显示所有仍打开的句柄。
    • -disable
      (仅限用户模式;仅限Windows Server 2003及更高版本)禁用句柄跟踪。在WindowsXP中,只有终止目标进程才能禁用句柄跟踪。
    • -?
      在调试器命令窗口中显示此扩展的一些简短帮助文本。

    支持环境

    Windows 2000

    不可用

    Windows XP 和更高版本

    Kdexts Ntsdexts

    备注

    启用句柄跟踪后,才能使用!htrace。启用句柄跟踪的一种方法是输入!htrace-enable命令。启用句柄跟踪时,每次进程打开句柄、关闭句柄或引用无效句柄时,都会保存堆栈跟踪信息。就是这个堆栈跟踪信息!htrace显示。还可以通过激活目标进程的应用程序验证器并选择Handles选项来启用句柄跟踪。

    ! htrace报告的某些跟踪可能来自不同的进程上下文。 在这种情况下, 返回地址在当前进程上下文中可能无法正确解析, 或可能解析为错误的符号。

    下面的示例显示有关进程0x81400300 中的所有句柄的信息:

    kd> !htrace 0 81400300
    Process 0x81400300
    ObjectTable 0xE10CCF60
    ## 
    
    Handle 0x7CC - CLOSE:
    0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
    0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
    0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
    0x801E1EDD: ntoskrnl!NtClose+0x19
    0x010012C1: badhandle!mainCRTStartup+0xE3
    ## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    
    Handle 0x7CC - OPEN:
    0x8018F44A: ntoskrnl!ExCreateHandle+0x94
    0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
    0x801E7317: ntoskrnl!ObInsertObject+0xC3
    0x77DE23B2: KERNEL32!CreateSemaphoreA+0x66
    0x010011C5: badhandle!main+0x45
    0x010012C1: badhandle!mainCRTStartup+0xE3
    ## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    
    Handle 0x7DC - BAD REFERENCE:
    0x8018F709: ntoskrnl!ExMapHandleToPointerEx+0xEA
    0x801E10F2: ntoskrnl!ObReferenceObjectByHandle+0x12C
    0x801902BE: ntoskrnl!NtSetEvent+0x6C
    0x80154965: ntoskrnl!_KiSystemService+0xC4
    0x010012C1: badhandle!mainCRTStartup+0xE3
    ## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    
    Handle 0x7DC - CLOSE:
    0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
    0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
    0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
    0x801E1EDD: ntoskrnl!NtClose+0x19
    0x010012C1: badhandle!mainCRTStartup+0xE3
    ## 0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    
    Handle 0x7DC - OPEN:
    0x8018F44A: ntoskrnl!ExCreateHandle+0x94
    0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
    0x801E7317: ntoskrnl!ObInsertObject+0xC3
    0x77DE265C: KERNEL32!CreateEventA+0x66
    0x010011A0: badhandle!main+0x20
    0x010012C1: badhandle!mainCRTStartup+0xE3
    0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    ## 
    
    Parsed 0x6 stack traces.
    Dumped 0x5 stack traces.