_ATL_DEBUG_INTERFACES

以前定义此宏包括所有ATL标头文件跟踪所有 AddRef,并 Release 在组件的接口称作"输出"窗口。

#define _ATL_DEBUG_INTERFACES

备注

跟踪输出将显示如下所示:

ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug

所有跟踪的第一部分始终 ATL: QIThunk。 接下来标识特定 接口thunk的 值。 接口thunk会用于对象维护引用计数并提供使用的"跟踪的示例使用。 新接口(在每个创建对 QueryInterface 但需要 IUnknown 接口(在此示例中,同一thunk每次返回符合COM的标识规则)。

接下来您将看到 AddRefRelease 指示调用方法。 遵循此操作,可以看到计数更改的标识接口引用的对象的值。 跟踪的值是对象的 this 指针。

跟踪的引用计数是该thunk的引用计数,在 AddRefRelease 调用之后。 记录下引用计数可能不匹配对象的引用计数。 每个thunk维护自己引用计数完全帮助您与COM的引用计数的规则。

跟踪的最终信息是对象的名称,然后 AddRef 影响的接口或 Release 调用。

检测到的所有接口泄漏,当服务器关闭,并 _Module.Term 调用方式如下记录:

ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug

信息提供了此处直接映射到上一个跟踪语句提供的信息,因此,您可以检查引用计数。接口thunk的整个生存期中。 此外,可以获得最大的表示形式引用该接口thunk的计数。

备注

_ATL_DEBUG_INTERFACES 可用于发布版本。

提示

  • 可以看到新接口形式转换(thunk)时是通过查找 AddRef 创建的调用与 Refcount 1。

  • 可以看到查找 Release 何时销毁接口thunk调用与 Refcount 0。

  • 跟踪语句是输出以制表符分隔的布局,因此可以轻松信息剪切和粘贴到电子表格(如Microsoft Excel提供高级筛选,搜索和排序功能。

  • 如果您的代码似乎可以很好地工作,当 _ATL_DEBUG_INTERFACES 未定义时,但是,导致访问冲突,当宏后,您几乎必须具有不匹配的引用计数的bug在客户端代码中,类似于如下所示的一个:

    IBug* pBug = NULL;
    hr = p->QueryInterface(&pBug);
    ATLASSERT(SUCCEEDED(hr));
    IBug* pBug2 = NULL;
    hr = p->QueryInterface(&pBug2);
    ATLASSERT(SUCCEEDED(hr));
    pBug->Release();
    pBug->Release();    // Mismatched - should be pBug2->Release();   
    

    此代码可能会在几个常见情况下工作,但是,它清楚地多虫。 为了使用此代码,它依赖于提供 IBug 接口(IBug 的COM对象的实现详细信息无法实现为拖曳接口),并且是位置相关的(客户端必须位于单元与 IBug 实现相同)。 为 _ATL_DEBUG_INTERFACES 宏的使用可以将此bug lights。

请参见

其他资源

调试和错误报告宏

ATL 宏