每次对象引用计数器递增或递减时, 对象引用跟踪 功能都会记录顺序堆栈跟踪。 跟踪可以帮助你检测对象引用错误,包括双重取消引用、引用失败和取消引用对象。 此功能仅在 Windows Vista 和更高版本的 Windows 中受支持。
有关在 “全局标志 ”对话框中配置对象引用跟踪功能的信息,请参阅 “配置对象引用跟踪”。 有关在命令提示符下配置对象引用跟踪功能的信息,请参阅 GFlags 命令。 有关示例,请参阅 示例 15:使用对象引用跟踪。
对象引用跟踪在怀疑特定对象未正确引用或解除引用时最有用,这通常是因为池使用率增加表明对象正在泄漏,或者即使进程或会话的句柄计数为零,它们仍然无法结束。 与记录在日志中以供日后查看的跟踪不同,对象引用跟踪设计用于实时使用,当进程正在运行时,对象也正在被引用和取消引用。 使用 !obtrace 调试器扩展在调试器中查看对象引用跟踪。 由于此扩展需要指定的对象地址,因此必须事先知道哪个对象可能是错误的源。
以下规则适用于对象引用跟踪:
一次只能运行一个对象引用跟踪。
由于内核范围的跟踪不实用,因此必须将跟踪限制为使用指定的池标记创建的对象,或者限制为由指定进程(由映像文件名指示)创建的对象,或两者。
只能为每个跟踪指定一个图像文件。 如果指定映像文件,跟踪仅限于映像所表示的进程创建的对象。 不会跟踪由进程引用但由其他进程创建的对象。
可以为每个跟踪指定最多 16 个池标记。 追踪具有任何指定池标记的对象。
如果同时指定映像文件和一个或多个池标记,则跟踪仅限于由进程创建并具有任何指定池标记的对象。
对象引用跟踪无法跟踪启动时已运行的进程。 跟踪仅包含在跟踪开始后启动的进程的对象。
被标记为跟踪的对象将被持续跟踪,直到对象被销毁或跟踪被禁用。 默认情况下,只有在对象被销毁之前,才会保留对象的跟踪,但可以指定“永久”跟踪(/p),直到禁用跟踪为止。
可以将对象引用跟踪配置存储为注册表设置或内核标志(运行时)设置。 如果同时具有注册表和内核标志设置,则运行时设置优先,但在关闭或重启计算机时会丢失。