[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine,以及媒體基礎的 音訊/視訊擷取所取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
本主題所述的許多偵錯功能都是在 DirectShow 基類連結庫中實作。 如需詳細資訊,請參閱 DirectShow 基類。
斷言檢查
請廣泛使用斷言檢查。 斷言可以驗證您在程式碼中針對前置條件和後置條件所做的假設。 DirectShow 提供數個斷言宏。 如需詳細資訊,請參閱 Assert 和斷點巨集。
物件名稱
在偵錯組建中,有一份從 CBaseObject類別衍生之物件的全域清單。 建立物件時,它們會新增至清單。 當它們被摧毀時,會從清單中移除。 若要顯示這些對象的清單,請呼叫 DbgDumpObjectRegister 函式。
CBaseObject 的建構函式方法 基類,以及衍生自它的大多數類別,都包含物件名稱的參數。 為您的物件提供唯一名稱以識別它們。 當您宣告名稱時,請使用 NAME 巨集,以便只在偵錯組建中配置名稱。 在零售版本中,名稱會變成 NULL。
偵錯記錄
DbgLog 函式會在程式執行時顯示偵錯訊息。 使用此函式來追蹤應用程式或篩選的執行。 您可以記錄傳回碼、變數的值,以及任何其他相關信息。
每個偵錯訊息都有類型,例如LOG_TRACE或LOG_ERROR,以及指出訊息重要性的偵錯層級。 具有較低偵錯層級的訊息比較高層級的訊息更重要。
在下列範例中,假想的篩選器會使單一針腳從針腳陣列中斷開。 如果中斷連線嘗試成功,過濾器會顯示LOG_TRACE訊息。 如果嘗試失敗,它會顯示LOG_ERROR訊息:
hr = m_PinArray[iPin]->Disconnect();
if (FAILED(hr))
{
DbgLog((
LOG_ERROR,
1,
TEXT("Could not disconnect pin %d. HRESULT = %#x",
iPin,
hr
));
// Error handling code (not shown).
}
DbgLog((LOG_TRACE, 3, TEXT("Disconnected pin %d"), iPin));
當您進行偵錯時,您可以為每個訊息類型設定偵錯層級。 此外,每個模組 (DLL 或可執行檔) 都會維護自己的偵錯層級。 如果您要測試篩選器,請提高包含該篩選器的 DLL 中的偵錯層級。
如需詳細資訊,請參閱 偵錯輸出函式。
重要區段
若要讓死結更容易追蹤,請包含判斷呼叫程式代碼是否擁有指定重要區段的判斷提示。 CritCheckIn 和 CritCheckOut 函式會指出呼叫線程是否擁有重要區段。 通常,您會從斷言巨集內呼叫這些函數。
您也可以使用 DbgLockTrace 函式來追蹤保留或釋放重要區段的時間。
相關主題