对象引用跟踪

每次递增或递减对象引用计数器时, 对象引用跟踪 功能都会记录顺序堆栈跟踪。 跟踪可帮助你检测对象引用错误,包括双重取消引用、引用失败和取消引用对象失败。 此功能仅在 Windows Vista 和更高版本的 Windows 中受支持。

有关在“ 全局标志 ”对话框中配置对象引用跟踪功能的信息,请参阅 配置对象引用跟踪。 有关在命令提示符下配置对象引用跟踪功能的信息,请参阅 GFlags 命令。 有关示例,请参阅 示例 15:使用对象引用跟踪

如果怀疑未正确引用或取消引用特定对象,则对象引用跟踪最有用,这通常是因为池使用量增加表明对象正在泄漏,或者进程或会话无法结束,即使其句柄计数为零。 与记录在日志中供以后查看的跟踪不同,对象引用跟踪设计为在进程正在运行且对象被引用和取消引用时实时使用。 使用 !obtrace 调试器扩展在调试器中查看对象引用跟踪。 由于此扩展需要指定的对象地址,因此必须提前知道哪个对象是错误的可能来源。

以下规则适用于对象引用跟踪:

  • 一次只能运行一个对象引用跟踪。

  • 由于内核范围的跟踪不切实际,因此必须将跟踪限制为使用指定的池标记创建的对象,或者限制为由指定进程创建的对象, (由映像文件名) 指示,或两者。

  • 只能为每个跟踪指定一个图像文件。 如果指定图像文件,则跟踪仅限于由图像表示的进程创建的对象。 不会跟踪由进程引用但由其他进程创建的对象。

  • 每个跟踪最多可以指定 16 个池标记。 跟踪具有任何指定池标记的对象。

  • 如果同时指定映像文件和一个或多个池标记,则跟踪仅限于进程创建并具有任何指定池标记的对象。

  • 对象引用跟踪无法跟踪启动时已在运行的进程。 跟踪仅包括跟踪开始后启动的进程的对象。

  • 将跟踪标记为跟踪的对象,直到对象被销毁或禁用跟踪。 默认情况下,对象的跟踪仅保留到对象销毁为止,但你可以指定 “永久” 跟踪 (/p) 跟踪将保留到禁用跟踪为止。

  • 可以将对象引用跟踪配置存储为注册表设置或内核标志 (运行时) 设置。 如果同时具有注册表和内核标志设置,则运行时设置优先,但在关闭或重新启动计算机时会丢失。