Share via


_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 巨集的使用方式可以提供這類錯誤燈光。

請參閱

其他資源

Debugging and Error Reporting Macros

ATL 巨集