Debugging Tools for Windows

!obtrace

!obtrace扩展显示指定对象的对象引用数据。

语法

!obtrace Object 

参数

Object
指向对象的指针或者路径。

DLL

Windows 2000 不可用
Windows XP和之后 Kdexts.dll

注释

Windows的对象引用跟踪功能会在每次对象的引用计数增加或者减少时记录调用堆栈。

使用该扩展命令来显示对象引用跟踪数据前,必须用GFlags来对指定的对象启用对象引用跟踪(object reference tracing) 。可以通过内核标志(运行时)设置来启用对象引用跟踪,这种改变会立即生效,但是关闭或重起之后消失;也可以通过注册表设置,这种设置需要重起,但是如果没有改变的话会一直保持下去。

下面是!obtrace扩展的输出示例:

kd> !obtrace 0xfa96f700
Object: fa96f700        Image: cmd.exe
Sequence  (+/-)  Stack
--------  -----  ---------------------------------------------------
   2421d    +1  nt!ObCreateObject+180
                nt!NtCreateEvent+92
                nt!KiFastCallEntry+104
                nt!ZwCreateEvent+11
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   2421e    -1  nt!ObfDereferenceObject+19
                nt!NtCreateEvent+d4
                nt!KiFastCallEntry+104
                nt!ZwCreateEvent+11
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   2421f    +1  nt!ObReferenceObjectByHandle+1c3
                win32k!xxxCreateThreadInfo+37d
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   24220    +1  nt!ObReferenceObjectByHandle+1c3
                win32k!ProtectHandle+22
                win32k!xxxCreateThreadInfo+3a0
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   24221    -1  nt!ObfDereferenceObject+19
                win32k!xxxCreateThreadInfo+3a0
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

----  ----------------------------------------------------------
References: 3, Dereferences 2

!obtrace 0xfa96f700显示出来的主要指示符在下表中列出。

参数 意义
Sequence 表示操作的顺序。
+/- 表示引用或者取消引用的操作。

+1 表示一次引用操作。

-1 表示一次取消引用操作。

+/-n 表示多次的引用/取消引用操作。

在x64目标机上的对象引用跟踪可能不完全,因为在IRQL高于PASSIVE_LEVEL的时候并不一定能够取到调用堆栈。

任何时候可以通过按下CTRL+BREAK (WinDbg)或CTRL+C (KD)中止命令。

附加信息

关于全局标志实用工具(GFlags)的更多信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon编写的Microsoft Windows Internals

Build machine: CAPEBUILD