DirectShow フィルターのデバッグ
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 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 関数を使用して、重要なセクションが保持または解放されたときにトレースすることもできます。
関連トピック