_ATL_DEBUG_INTERFACES
Definieren Sie dieses Makro zuvor einschließlich aller deaktivieren, um alle AddRef und Release Aufrufe auf den Schnittstellen der Komponenten in das Ausgabefenster aufzuzeichnen.
#define _ATL_DEBUG_INTERFACES
Hinweise
Die Ablaufverfolgungsausgabe wird wie unten dargestellt:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
Der erste Teil jeder Ablaufverfolgung ist immer ATL: QIThunk.Ist als Nächstes ein Wert, der den bestimmten Schnittstellenthunk identifiziert, der verwendet wird.Ein Schnittstellenthunk ist ein Objekt, das verwendet wird, um einen Verweiszähler beizubehalten und die Ablaufverfolgung bereitzustellen, die hier verwendet wird.Ein neuer Schnittstellenthunk wird bei jedem Aufruf QueryInterface außer Anforderungen für die IUnknown-Schnittstelle erstellt (in diesem Fall, wird der gleiche Thunk jedes Mal zurückgegeben, um mit Identitätsregeln COM widerspiegelt).
Als Nächstes finden Sie unter AddRef oder Release anzugeben, welche Methode aufgerufen wurde.Das folgende, finden Sie unter einen Wert, das Objekt zu identifizieren, dessen Schnittstellenverweiszähler geändert wurde.Der aufgezeichnete Wert ist der this Zeiger des Objekts.
Der, der Verweiszähler aufgezeichnet wird, ist der Verweiszähler auf diesem Thunk, nachdem AddRef oder Release aufgerufen wurden.Beachten Sie, dass dieser Verweiszähler möglicherweise nicht den Verweiszähler für das Objekt übereinstimmt.Jeder Thunk wird ein eigener Verweiszähler an, um Ihnen vollständig, lassen sich mit Verweiszählungsregeln COM angepasst.
Die letzte Informationen, die aufgezeichnet wird, ist der Name des Objekts und der Schnittstelle, die von den AddRef oder Release Aufruf beeinflusst wird.
Alle Schnittstellenverluste, die erkannt werden, als der Server heruntergefahren wird und _Module.Term wird protokolliert werden so aufgerufen:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
Die Informationen, die hier bereitgestellt werden, ordnen direkt zu Informationen zu, die in vorherigen Ablaufverfolgungsanweisungen enthalten sind, sodass Sie die Verweiszähler während der gesamten Lebensdauer eines Schnittstellenthunks überprüfen.Außerdem erhalten Sie eine Übersicht über den maximalen Verweiszähler auf diesem Schnittstellenthunk ab.
Hinweis |
---|
_ATL_DEBUG_INTERFACES kann in den Verkaufsversionsbuildern verwendet werden. |
Tipps
Sie können sehen, wenn ein neuer Schnittstellenthunk erstellt wurde, indem Sie nach AddRef Aufrufen mit Refcount von 1. sucht.
Sie können sehen, wenn ein Schnittstellenthunk zerstört wird, indem Sie nach Release Aufrufen mit Refcount von 0 gefunden.
Die Ablaufverfolgungsanweisungen werden in einem durch Tabulatoren getrennten Format ausgegeben, sodass Sie die Informationen in ein Arbeitsblatt wie Microsoft Excel leicht schneiden und, um erweiterte Filterung bereitzustellen und suchen, und Sortieren von Funktionen.
Wenn der Code scheint, problemlos zu sein, wenn _ATL_DEBUG_INTERFACES nicht definiert ist, aber Zugriffsverletzungen verursacht, wenn das Makro definiert ist, haben Sie fast durch einen nicht übereinstimmenden Verweiszählungsfehler im Clientcode, der von den ähnelt, der folgenden:
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();
Dieser Code wird, unter Umständen einige häufige zu arbeiten, ist eindeutig verwanzt.Damit dieser Code vorhanden ist, setzt er auf Implementierungsdetails des COM-Objekts, das die IBug-Schnittstelle (IBug bereitstellt, kann nicht als Tearoff-Schnittstelle implementiert werden) und es ist Speicherortabhängiges Element (der Client muss in demselben Apartment wie die IBug Implementierung sein).Verwendung des _ATL_DEBUG_INTERFACES-Makro kann solche Fehler abrufen, um auf Lichtobjekte.