_ATL_DEBUG_INTERFACES
Укажите этот макрос раньше включая все файлы заголовков библиотеки ATL для трассировки все вызовы AddRef и Выпуск в интерфейсах ваших компонентов в окно вывода.
#define _ATL_DEBUG_INTERFACES
Заметки
Вывод трассировки отображается как показано ниже:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
Первая часть каждого трассировки всегда будет ATL: QIThunk.Далее значение, содержащее указанный используемого преобразователя интерфейса.Преобразователь интерфейса объект, используемый для поддержания счетчиков ссылок и для обеспечения возможности трассировки, используемую здесь.Новый преобразователь интерфейса создать на каждом вызове QueryInterface за исключением запросов для интерфейса IUnknown (в этом случае, один и тот же преобразователь возвращается при каждом соответствовать правилам идентификаторов модели COM).
Далее вы увидите AddRef или отображать Выпуск, метод был вызван.Следуйте этим, можно увидеть, что значение, указанное объектом которого счетчик ссылок интерфейса был изменен.Трассированное значение указателя this объекта.
Значение счетчика ссылок, трассирован счетчик ссылок на этом преобразователе после AddRef или Выпуск были Вызываются.Обратите внимание, что этот счетчик ссылок не может сопоставить счетчика ссылок для объекта.Каждый преобразователь поддерживает собственный счетчика ссылок для облегчения полностью соответствовать правилам модели COM ссылка- учитываются.
Финальная трассированная сведения имя объекта и интерфейса, влиянной на вызов AddRef или Выпуск.
Вызываются все утечки интерфейса, обнаружены, когда сервер завершает работу и _Module.Term записываются в журнал следующим образом:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
Сопоставляет сведения, здесь непосредственно к предоставленному в предыдущих выписках сведения трассировки, поэтому можно просмотреть счетчики ссылок на протяжении всего времени существования преобразователя интерфейса.Кроме того, появляется индикатор max счетчика ссылок на этом преобразователе интерфейса.
Примечание |
---|
_ATL_DEBUG_INTERFACES можно использовать в розничных построениях. |
Советы
Можно видеть, когда новый преобразователь интерфейса создать, выполнив поиск вызовов AddRef с Refcount 1.
Можно видеть, когда преобразователь интерфейса уничтожается, выполняя поиск вызовов Release с Refcount 0.
Выписки вывода трассировки наследование в вкладка- отделенном формате, поэтому можно легко вырезать и вставить данные в электронную таблицу Microsoft Excel как предоставить предварительный фильтрации, поиска и сортировки.
Если кажется, что работает нормально, когда _ATL_DEBUG_INTERFACES не задано, но причиняется код Нарушения прав доступа, если макрос определяется, почти определенно использовать рассогласованную ссылка- учета ошибок в коде клиента таком до показано ниже:
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();
Этот код может показаться, что работал в некоторых типичных обстоятельствах, но он более точно дефектен.Для этого кода, который будет работать на всех его основывается на сведениях реализации com-объекта, предоставляющий интерфейс IBug (IBug, невозможно реализовать так как перемещаемый интерфейс) и это место хранения- зависимые (клиент должен находиться в том же подразделении, как реализации IBug ).Использование макроса _ATL_DEBUG_INTERFACES может достичь такие ошибки осветить.