偵錯輸出函式

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

DirectShow 基類提供數個宏來顯示偵錯資訊。

函式 描述
DbgCheckModuleLevel 檢查是否針對指定的訊息類型和層級啟用記錄。
DbgDumpObjectRegister 顯示作用中物件的相關資訊。
DbgInitialise 初始化偵錯程式庫。
DbgLog 如果為指定的類型和層級啟用記錄,則會將字串傳送至偵錯輸出位置。
DbgOutString 將字串傳送至偵錯輸出位置。
DbgSetModuleLevel 設定一或多個訊息類型的記錄層級。
DbgTerminate 清除偵錯程式庫。
DisplayType 將媒體類型的相關資訊傳送至偵錯輸出位置。
DumpGraph 將篩選圖形的相關資訊傳送至偵錯輸出位置。
GuidNames 包含表示 Uuids.h 中定義之 GUID 的字串的全域陣列。
名字 產生僅限偵錯的字串。
注意 將字串傳送至偵錯輸出位置。
提醒 在編譯時期產生提醒。

 

登錄機碼

DirectShow 中的偵錯輸出函式會使用一組登錄機碼。 這些登錄機碼的位置取決於 Windows 版本。

在 Windows Vista 之前,偵錯金鑰位於下列路徑下方:

\ HKEY_LOCAL_MACHINE軟體\調試

在 Windows Vista 或更新版本中,它們位於下列路徑下方:

\ HKEY_LOCAL_MACHINE軟體\微軟\DirectShow\調試

對於協力廠商篩選,位置取決於使用哪一個版本的 DirectShow 基類 來建置篩選。 Windows SDK for Windows Vista 中包含的版本會使用較新的路徑。 舊版使用較舊的路徑。

在後續的備註中,會使用標籤< DebugRoot >來指出這兩個路徑。 根據 Windows 版本或基類的版本,取代正確的路徑。

偵錯記錄

DirectShow 會定義數種訊息類型,如下表所示。

Description
LOG_ERROR 錯誤通知。
LOG_LOCKING 鎖定和解除鎖定重要區段。
LOG_MEMORY 記憶體配置,以及物件建立和解構。
LOG_TIMING 計時和效能測量。
LOG_TRACE 一般呼叫追蹤。
CUSTOM1 到 CUSTOM5 可用於自訂偵錯訊息

 

每個 DirectShow 偵錯記錄函式都會指定訊息類型和記錄層級。 只有在該訊息類型的目前偵錯層級等於或大於記錄函式中指定的層級時,才會顯示偵錯訊息。 否則會忽略訊息。

例如,如果LOG_TRACE層級為 3 或更高版本,下列程式碼會輸出字串「這是偵錯訊息」:

DbgLog((LOG_TRACE, 3, TEXT("This is a debug message")));

每個模組都可以為每個訊息類型設定自己的偵錯層級。 (模組 是可使用 LoadLibrary 函式載入的 DLL 或可執行檔。) 模組的偵錯層級會出現在登錄的下列機碼底下:

\ HKEY_LOCAL_MACHINE< DebugRoot >\< ModuleName >\< MessageType >

其中< 訊息類型是訊息類型 >減去初始 「LOG_」;例如,LOG_LOCKING訊息的LOCKING。 載入模組時,偵錯程式庫會在登錄中找到模組的記錄層級。 如果登錄機碼不存在,偵錯程式庫會建立它們。

模組也可以使用 DbgSetModuleLevel 函式,在執行時間設定自己的層級。 若要將訊息傳送至偵錯輸出,請呼叫 DbgLog 宏。 下列範例會建立類型為 LOG_TRACE 的第 3 層訊息:

您也可以使用下列登錄機碼來指定全域記錄層級:

\HKEY_LOCAL_MACHINE\<DebugRoot>\GLOBAL\<Message Type>

偵錯程式庫會使用大於哪個層級、全域層級或模組層級。

偵錯輸出位置

偵錯輸出位置是由另一個登錄機碼所決定:

\ HKEY_LOCAL_MACHINE< DebugRoot >\< Modile Name >\LogToFile

如果此索引鍵的值是 Console ,輸出會移至主控台視窗。 如果值為 DebDebugDebugger 或空字串,則輸出會移至偵錯工具視窗。 否則,輸出會寫入登錄機碼所指定的檔案。

可執行檔使用 DirectShow 偵錯程式庫之前,它必須呼叫 DbgInitialise 函式。 之後,它必須呼叫 DbgTerminate 函式 。 DLL 不需要呼叫這些函式,因為基類程式庫中定義的 DLL 進入點 () 自動呼叫它們。

偵錯公用程式