偵錯 DirectShow 篩選
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對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函式會指出呼叫執行緒是否擁有重要區段。 一般而言,您會從 assert 宏內呼叫這些函式。
您也可以使用 DbgLockTrace 函式來追蹤保留或釋放重要區段的時間。
相關主題