Microsoft DirectX 8.0 |
このトピックは Microsoft® DirectShow® アプリケーションとフィルタをデバッグする際のヒントをいくつか提供する。
このトピックには次のセクションが含まれる :
参照 : GraphEdit によるグラフ構築のシミュレーション
アサート チェック ライブラリを使うこと。アサートはコード内の必要条件、十分条件について作成した仮定を検証する。DirectShow はいくつかのアサート マクロを提供する。詳細については、「アサート マクロとブレークポイント マクロ」を参照すること。
たとえば、ピン クラスにピンが接続されていると仮定したプライベート メソッドが含まれているかもしれない。以下のように、アサートを使ってこの仮定をテストできる :
ASSERT(IsConnected()); // ピンは接続されていなければならない。
デバッグ ビルドでは、CBaseObject クラスから派生したオブジェクトのグローバル リストがある。オブジェクトが作成されると、それはリストに追加される。そのオブジェクトが削除されると、リストから消去される。オブジェクトのリストを表示するには、DbgDumpObjectRegister 関数を呼び出すこと。
CBaseObject 基底クラス (とそこから派生された大部分のクラス) のコンストラクタ メソッドにはオブジェクト名についてのパラメータが含まれている。それを識別する固有の名前をオブジェクトにつけること。名前の宣言に NAME マクロを使うと、名前の文字列はデバッグ ビルド時にのみ割り当てられる。リテール ビルドでは、その名前は NULL となる。
DbgLog 関数はプログラム実行時にデバッグ メッセージを表示する。この関数を使ってアプリケーションやフィルタの例外をトレースすること。戻り値や、変数の値、それ以外の任意の関連情報をログすることができます。
すべてのデバッグ メッセージは LOG_TRACE や LOG_ERROR のようなメッセージ タイプ、メッセージの重要度を示すデバッグ レベルを持っている。低いデバッグ レベルは高いレベルより重要となる。
次の例では、仮のフィルタがピン配列からあるピンを接続解除する。接続解除が成功すると、フィルタは LOG_TRACE メッセージを表示する。それが失敗すると、LOG_MESSAGE を表示する :
hr = m_PinArray[iPin]->Disconnect(); if (FAILED(hr)) { DbgLog((LOG_ERROR, 1, TEXT("Could not disconnect pin %d. HRESULT = %#x", iPin, hr)); // エラー ハンドリング コード (省略). } DbgLog((LOG_TRACE, 3, TEXT("Disconnected pin %d"), iPin));
デバッグ中に、各メッセージ タイプのデバッグ レベルを設定することができる。また各モジュール (DLL あるいは 実行モジュール) は自分自身のデバッグ レベルを保持する。フィルタをテストしているなら、そのフィルタを持つ DLL のデバッグ レベルを上げること。詳細については、「デバッグ出力関数」を参照すること。
デッドブロックをより容易にトラックするには、呼び出しコードが与えられたクリティカル セクション自身を所有しているかどうかを確認するアサートをインクルードすること。CritCheckIn と CritCheckOut 関数は呼び出し元のスレッドがクリティカル セクションを所有しているかどうかを示す。通常、アサート マクロ内部からこれらの関数が呼び出される。詳細については、「クリティカル セクション デバッグ関数」を参照すること。
クリティカル セクションが取得、解放されたときに、DbgLockTrace 関数を使ってトレースすることもできる。
ポインタの有効性を考慮すること。たとえば、ValidateReadPtr マクロはして下ポインタが読み込み可能なメモリを指しているかどうかをチェックする。現在、DirectShow ポインタ有効マクロは IsBadReadPtr のような Microsoft® Win32® ポインタ評価関数を使用する。あるシステムでは、これらの関数が指定した範囲でページごとにスワップを起こす場合がある、これは著しくパフォーマンスを低下させる。詳細については、「ポインタ有効マクロ」を参照すること。