プリンター ドライバー レンダリング プラグインまたはユーザー インターフェイス プラグインを開発している場合は、これらのコンポーネントでデバッグ メッセージを有効にすることができます。 「グローバル デバッグ変数」セクションで説明されているように、グローバル デバッグ変数を使用して、デバッガー ウィンドウに表示されるメッセージの詳細レベルを制御できます。
「メッセージ マクロのデバッグ」セクションで説明されているマクロを使用すると、さまざまな条件下でデバッガー ウィンドウにメッセージを送信できます。 さらに、これらの DLL のビルドをチェックしている場合は、このセクションの情報を使用して、Microsoft ユニバーサル プリンター ドライバー (Unidrv) または PostScript プリンター ドライバー (Pscript) レンダラーでデバッグ メッセージを有効にすることができます。
Note
チェック ビルドは、Windows 10 バージョン 1803 以前の古いバージョンの Windows で使用することができました。 ドライバー検証ツールや GFlags などのツールを使用して、新しいバージョンの Windows のドライバー コードをチェックします。
ユーザー モード ドライバーのデバッグ手順と一般的なデバッグのヒントについては、次の 2 つのセクションで説明します。
ユーザー モード デバッグの準備
プリンター ドライバーとそのコンポーネントのデバッグを開始するには:
最新の デバッグツール をインストールします。 Windows 用デバッグ ツールのダウンロード を参照してください
Windows シンボル パッケージ から 正しいシンボルをインストールする
Note
最新バージョンのデバッガーを使用することが非常に重要です。
デバッグに関心のあるコンポーネントのみのチェックビルドをインストールすることをお勧めします。 通常は、次のリテール バイナリを対応するチェックビルドに置き換えます。
Unidrv.dll
Unidrvui.dll
Unires.dll
また、Oemuni サンプルまたはデバッグ中のプリンター ドライバーのチェックビルドもインストールする必要があります。 この方法を使用する利点は、チェックビルド システム全体をインストールするのではなく、システム全体の速度を低下させないということです。
ユーザー モード デバッグ セッションの開始
ユーザー モードのデバッグを開始するには、Windbg デバッガーの [ファイル] メニューで、[プロセスにアタッチ] を選択します。 デバッガーをアタッチするプロセスは、デバッグしようとしているシナリオによって異なります。 プリンター ドライバーの場合は、デバッガーを印刷アプリケーションまたはスプーラー プロセス (Spoolsv.exe) にアタッチする必要があります。 スプーラー プロセスがレンダリング モジュールを読み込む間、印刷アプリケーションが構成/ユーザー インターフェイス モジュールを読み込む点に注意してください。 ただし、"FILE:"印刷について違いがあります。つまり、スプーリングが行われず、その結果、レンダリング モジュールも印刷アプリケーションによって読み込まれます。 そのため、必ず正しいプロセスにアタッチする必要があります。
Note
ユーザー モード デバッグには、2 つの個別のマシンは必要ありません。
次の手順では、Oemuni サンプルをデバッグする準備をします。
"FILE:" ポートに Oemuni サンプルをインストールします。
スタート メニューをクリックし、[すべてのプログラム]、[アクセサリ] の順に選択し、WordPadを選択して WordPad アプリケーションを起動します。
WinDbg ファイル メニューから、プロセスへのアタッチ を選択します。 使用可能なプロセスの一覧で、WordPad.exeを選択します。
WordPadから印刷ジョブを開始します。 これで、Oemuni サンプルをデバッグする準備ができました。
giDebugLevel 変数を有効にすると、詳細デバッグを有効にすることができます。 既定値は 3 で、警告を示します。 1 に設定すると、VERBO を表します。 後者の値を Unidrv.dll で設定するには、デバッガーで次のコマンドを入力します:
> ed unidrv!giDebugLevel 1
Oemuni サンプルを実行している場合は、同じデバッグ変数も適用されるため、詳細デバッグを有効にするには、次のコマンドを入力します:
> ed oemuni!giDebugLevel 1
Oemuni サンプルに独自のデバッグ ステートメントを追加することもできます。
デバッグ値の設定の詳細については、WinDbg のドキュメントを参照してください。このドキュメントでは、使用可能なコマンドについて説明し、ユーザー モード デバッグを設定するために必要な手順の概要を示します。 ドキュメントにアクセスするには、WinDbg の [ヘルプ] メニューの [コンテンツ] を選択します。
グローバル デバッグ変数
giDebugLevel グローバル変数は、Debug.h ファイルと Debug.cpp ファイル内の Oemui サンプルと Oemuni サンプルによって宣言されます。 giDebugLevel の値は、次の方法で変更できます:
- デバッガーでの値の変更
- プラグインでの値の再定義
giDebugLevelは、次のいずれかの値に設定できます。
#define DBG_VERBOSE 1
#define DBG_TERSE 2
#define DBG_WARNING 3
#define DBG_ERROR 4
#define DBG_RIP 5
メッセージ マクロのデバッグ
デバッグの目的で使用されるマクロを次に示します。 そのうちのいくつかは、出力されるデバッグ メッセージを制御する giDebugLevel グローバル変数が特定の値に設定されている場合にのみアクションを実行します。 マクロは、空きビルドの空白に拡張されます。 ここでは、実行内容とそのパラメーターについて簡単に説明します。
ASSERT(cond)
- cond のブール式が TRUE かどうかを確認します。 そうでない場合、マクロは強制的にブレークポイントを設定します。
ASSERTMSG(cond、 (msg))
- cond のブール式が TRUE かどうかを確認します。 そうでない場合、マクロはメッセージを msg に 表示し、 ブレークポイントを強制します。
ERR((msg))
現在のデバッグ レベルが = DBG_ERRORの場合、メッセージを msg< に表示します。 メッセージ形式は次の通りです:
ERR filename (linenumber): msg
RIP((msg))
- msg のメッセージを表示し、ブレークポイントを強制します。
TERSE((msg))
- 現在のデバッグ レベルが = DBG_TERSEの場合、メッセージを msg< に表示します。
VERBO((msg))
- 現在のデバッグ レベル = DBG_TERSEの場合、メッセージを msg< に表示します。
WARNING((msg))
現在のデバッグ レベル = DBG_TERSEの場合、メッセージを msg< に表示します。 メッセージ形式は次の通りです:
WRN filename (linenumber): msg
msg 引数を持つすべてのマクロには、この引数を囲む括弧の追加ペアが必要であることに留意してください。 この要件を説明するために 2 つの例を示します。
ASSERTMSG(x > 0, ("x is less than 0\n"));
WARNING( ("App passed NULL pointer, ignoring...\n") );
msg 引数を含むマクロは、Debug.h ヘッダーの Oemui サンプルと Oemuni サンプルによって定義されます。