_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的标识规则)。
接下来您将看到 AddRef 或 Release 指示调用方法。 遵循此操作,可以看到计数更改的标识接口引用的对象的值。 跟踪的值是对象的 this 指针。
跟踪的引用计数是该thunk的引用计数,在 AddRef 或 Release 调用之后。 记录下引用计数可能不匹配对象的引用计数。 每个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。