示例 15:使用对象引用跟踪

对象引用跟踪是一项 Windows 功能,在引用或取消引用对象时记录顺序堆栈跟踪。 它旨在检测可能导致崩溃或内存泄漏的对象处理中的错误。 其中一些错误难以检测,因为它们不一致出现。 有关详细信息,请参阅 对象引用跟踪

可以使用“全局标志”对话框或在命令提示符下配置对象引用跟踪。 以下示例使用命令提示符。 有关使用 “全局标志 ”对话框配置对象引用跟踪的信息,请参阅 “配置对象引用跟踪”。

可以使用 Gflags 来启用、禁用和配置对象引用跟踪。 过程如下:

  • 使用 Gflags 在注册表中启用对象引用跟踪 或作为内核标志(运行时)设置。 如果将设置添加到注册表,则必须重新启动计算机以开始跟踪。 如果启用设置的运行时版本,跟踪会立即启动,但在关闭或重启计算机时,跟踪设置会还原到注册表项中的那些设置。

  • 启动创建可疑对象的过程。 跟踪仅包含由跟踪开始后启动的进程创建的对象。 如果进程在重新启动期间或不久启动,请将跟踪设置添加到注册表,然后重启系统。

  • 使用 !obtrace 调试器扩展查看跟踪。 默认情况下,跟踪将一直保留到对象被销毁为止,但可以使用 /p 参数来维护跟踪,直到禁用跟踪。

  • 使用 Gflags 在注册表中禁用对象引用跟踪,或作为内核标志(运行时)设置。 如果从注册表中删除该设置,则必须重新启动计算机以结束跟踪。 如果禁用设置的运行时版本,跟踪会立即结束,但在关闭或重启计算机时,跟踪设置会还原到注册表中的设置。

这些示例演示如何使用 Gflags 来启用和禁用对象引用跟踪。 \

启用运行时跟踪

以下命令在命令提示符下启用对象引用跟踪。 该命令使用 /ko 参数将对象引用跟踪启用为内核标志(运行时)设置。 该命令使用 /t 参数指定池标记 Tag1Fred。 因此,跟踪使用 Tag1Fred 创建的所有对象。

gflags /ko /t Tag1;Fred

由于命令更改了内核标志(运行时)设置,因此对象引用跟踪会立即启动。 跟踪将包含池标记 Tag1Fred 的所有对象,这些对象由提交命令后启动的进程创建。

Gflags 通过打印以下消息做出响应:

Running Kernel Settings :
Object Ref Tracing Enabled
        Temporary Traces
        Pool Tags: Tag1;Fred
        Process Name: All Processes

此消息指示已启用对象引用跟踪。 “临时跟踪”指示在销毁对象时删除跟踪的所有记录。 若要使跟踪“永久”,请使用 /p 参数,该参数指示 Windows 在禁用对象引用跟踪之前保留跟踪数据,或者计算机关闭或重启。

在注册表中启用跟踪

以下命令将对象引用跟踪配置添加到注册表。 配置的跟踪将在重新启动计算机时开始。

该命令使用 /ro 参数启用对象引用跟踪作为注册表设置。 该命令使用 /i 指定notepad.exe和 /t 参数的进程来指定池标记 Tag1Fred。 因此,跟踪使用 Tag1 或 Fred 池标记的记事本进程创建的所有对象。 该命令还使用 /p 参数,该参数将保留跟踪数据,直到禁用跟踪。

gflags /ro /t Tag1;Fred /i Notepad.exe /p

提交命令时,Gflags 会将信息存储在注册表中。 但是,由于注册表设置在重新启动计算机之前无效,因此已配置此对象引用跟踪,但尚未启动。

Gflags 通过打印以下消息做出响应:

Boot Registry Settings :
Object Ref Tracing Enabled
        Permanent Traces
        Pool Tags: Tag1;Fred
        Process Name: Notepad.exe

该消息指示在注册表中启用了对象引用跟踪。 “永久跟踪”表示跟踪数据将保留,直到关闭或重启计算机。 该消息还会列出将跟踪的池标记和映像文件名。

显示对象引用跟踪配置

可以显示当前有效或存储在注册表中的对象引用跟踪配置,以便在计算机重新启动时使用。

在此示例中,注册表中存储了一个对象引用跟踪配置,为运行时配置了不同的对象引用跟踪配置。 运行时跟踪会立即开始(并替代任何注册表设置)。 但是,如果重新启动系统,运行时设置将丢失,并且对象引用跟踪会话注册表设置将生效。

以下命令显示运行时对象引用跟踪配置。 它使用没有其他参数的 /ko 参数。

gflags /ko
Running Kernel Settings :
Object Ref Tracing Enabled
        Temporary Traces
        Pool Tags: Tag1;Fred
        Process Name: All Processes

如果启用了对象引用跟踪,如本示例中所示,显示的设置描述了正在进行的跟踪。

以下命令显示存储在注册表中的对象引用跟踪配置数据。 它使用没有其他参数的 /ro 参数。

gflags /ro

作为响应,Gflags 显示注册表中存储的数据:

Boot Registry Settings :
Object Ref Tracing Enabled
        Permanent Traces
        Pool Tags: Tag1;Fred
        Process Name: Notepad.exe

如果在将对象引用跟踪配置添加到注册表后重启了计算机,则响应 gflags /ro 命令时显示的设置描述了正在进行的跟踪。 但是,如果尚未重启或已重启,但随后启动运行时对象引用跟踪(/ko),则注册表中存储的设置当前无效,但在重新启动系统时,它们将再次生效。

禁用对象引用跟踪

禁用运行时(内核标志)对象引用跟踪设置时,跟踪会立即停止。 在注册表中禁用对象引用跟踪设置时,跟踪会在重新启动计算机时停止。

以下命令禁用运行时对象引用跟踪。 它使用 /d 参数禁用所有设置。 不能有选择地禁用设置。

gflags /ko -d

命令成功后,Gflags 将响应以下消息:

Running Kernel Settings :
Object Ref Tracing Disabled

以下命令禁用运行时对象引用跟踪。

以下命令禁用注册表中的对象引用跟踪设置。 它使用 /d 参数禁用所有设置。 不能有选择地禁用设置。 重启计算机时,此命令有效。

gflags /ro -d

命令成功后,Gflags 将响应以下消息:

Boot Registry Settings :
Object Ref Tracing Disabled