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

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

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

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

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

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

  • 使用!obtracedebugger扩展查看跟踪。 默认情况下,跟踪一直保留到对象被销毁,但可以使用 /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。 因此,跟踪由标记进程创建记事本 Tag1Fred 池标记。 该命令还使用 /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