_ATL_DEBUG_INTERFACES
Prima di definire questa macro inclusi tutti i file di intestazione ATL per rilevare tutte le chiamate Release e AddRef le interfacce dei componenti nella finestra di output.
#define _ATL_DEBUG_INTERFACES
Note
L'output di traccia verrà visualizzato come illustrato di seguito:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
La prima parte di ogni analisi verrà sempre ATL: QIThunk.Successivamente sarà un valore che identifica il thunk dell'interfaccia utilizzato.Un thunk dell'interfaccia è un oggetto utilizzato per mantenere il conteggio dei riferimenti e fornire la funzionalità di traccia utilizzata.Un nuovo thunk di interfaccia viene creato su ogni chiamata a QueryInterface fatta eccezione per le richieste per l'interfaccia IUnknown (in questo caso, lo stesso thunk viene restituito ogni volta in conformità alle regole di identità COM).
Una volta visualizzato AddRef o un'indicazione Release il metodo è stato chiamato.Seguendo questa operazione, verrà visualizzato un valore identificare l'oggetto di cui il conteggio dei riferimenti dell'interfaccia è stato modificato.Il valore rintracciato è il puntatore this dell'oggetto.
Il conteggio dei riferimenti che è rintracciato è il conteggio dei riferimenti nel thunk dopo AddRef o Release è stato chiamato.Si noti che il conteggio dei riferimenti non deve corrispondere al conteggio dei riferimenti per l'oggetto.Ogni thunk mantiene il relativo conteggio dei riferimenti per consentire completamente a rispettare le regole di conteggio dei riferimenti COM.
Informazione finale analizzata è il nome dell'oggetto e dell'interfaccia interessati dalla chiamata Release o AddRef.
Tutte le perdite dell'interfaccia rilevate quando il server ha interrotto e _Module.Term viene chiamato saranno registrate come segue:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
Informazioni fornite in questo argomento vengono mappati direttamente alle informazioni fornite nelle istruzioni di traccia precedenti, pertanto è possibile esaminare i conteggi dei riferimenti durante l'intera durata di un thunk dell'interfaccia.Inoltre, ottenere un'indicazione del conteggio dei riferimenti massimo sul thunk dell'interfaccia.
[!NOTA]
_ATL_DEBUG_INTERFACES può essere utilizzato nelle build per la vendita.
Suggerimenti
È possibile visualizzare quando un nuovo thunk di interfaccia viene creato cercare chiamate AddRef con Refcount di 1.
È possibile visualizzare quando un thunk di interfaccia viene eliminato dalle chiamate Release con Refcount di 0.
Le istruzioni di traccia vengono restituite in un formato separato pertanto è possibile tagliare e incollare le informazioni in un foglio di calcolo di Microsoft Excel come fornire un filtro avanzate, ricerca e ordinamento le funzionalità.
Se il codice viene eseguito in modo corretto quando _ATL_DEBUG_INTERFACES non è definito, ma causa delle violazioni di accesso quando la macro viene definita, quasi certamente si dispone di un bug non corrispondenti di conteggio dei riferimenti nel codice client, simile a quello riportato di seguito:
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();
Questo codice può essere eseguito in alcune situazioni ordinarie, ma è chiaramente con errori.Affinché il codice funzioni a tutti, si basa sui dettagli di implementazione dell'oggetto COM che fornisce l'interfaccia IBug (IBug non può essere distribuito come un'interfaccia tear-off) e viene posizione- dipendente (il client deve essere nello stesso apartment dell'implementazione IBug ).L'utilizzo della macro _ATL_DEBUG_INTERFACES può contenere questi bug per illuminarsi.