_ATL_DEBUG_INTERFACES
先前已定義這個巨集包含所有 ATL 標頭檔追蹤您的元件介面的所有 AddRef 和 版本 呼叫至輸出視窗。
#define _ATL_DEBUG_INTERFACES
備註
追蹤輸出會顯示如下所示:
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
每一個追蹤的第一部分將永遠 ATL: QIThunk。接著識別特定 介面 Thunk 的 值使用。介面 Thunk 是一種物件維護參考計數和所提供的追蹤功能在這個位置。新介面 Thunk 在 [ QueryInterface 的每個呼叫都會建立但必須 IUnknown 介面 (在此例中,相同的 Thunk 每次傳回符合 COM 的識別規則)。
接下來您會看到 AddRef 或 版本 指示要呼叫的方法。接著,您會看到值識別變更介面參考計數的物件。要追蹤的值是物件的 this 指標。
要追蹤的參考計數是 Thunk 的參考計數,在 AddRef 或 版本 之後呼叫。請注意此參考計數可能不符合物件的參考計數。每個 Thunk 維護其本身的參考計數完全可協助您遵守 COM 參考計數的規則。
要追蹤的最後的資訊是 AddRef 或 版本 呼叫的和介面所影響的物件名稱。
偵測到的任何介面遺漏,當伺服器關閉,並 _Module.Term 呼叫這類就會記錄:
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
這裡的資訊提供對應直接寫入上一個追蹤陳述式提供的資訊,因此,您可以檢查參考次數 (Reference Count) 在介面中 Thunk 的整個存留期 (Lifetime)。此外,就能取得完整參考計數的指示該介面的 Thunk。
注意事項 |
---|
_ATL_DEBUG_INTERFACES 可用於正式版本組建。 |
秘訣
您可以使用 Refcount 的新介面 Thunk 何時會尋找 AddRef 呼叫建立 1。
您可以尋找 Release 呼叫時被終結。 Refcount 的介面 Thunk 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();
這個程式碼可能會在某些常見的狀況下運作,不過,它清楚多 Bug。如需此工作的程式碼時,它會根據提供 IBug 介面 (IBug 的 COM 物件的實作詳細資料無法實作,因為 Tear-Off 介面),並將其位置相關 (用戶端必須是 Apartment 和 IBug 實作相同)。為 _ATL_DEBUG_INTERFACES 巨集的使用方式可以提供這類錯誤燈光。