共用方式為


偵錯印表機驅動程式元件

如果您要開發印表機驅動程式轉譯外掛程式或使用者介面外掛程式,您可以在這些元件中啟用偵錯訊息。 如全域偵錯變數一節所述,您可以使用全域偵錯變數來控制出現在偵錯工具視窗中之訊息中的詳細資料層級。

您可以使用偵錯訊息宏一節中討論的宏,在各種情況下將訊息傳送至偵錯工具視窗。 此外,您可以使用本節中的資訊,在 Microsoft Universal Printer Driver (Unidrv) 或 PostScript Printer Driver (Pscript) 轉譯器中啟用偵錯訊息,前提是您已檢查這些 DLL 的組建。

注意

已檢查的組建可在舊版 Windows 上取得,Windows 10 1803 版之前。 使用驅動程式驗證器和 GFlags 之類的工具,在更新版本的 Windows 中檢查驅動程式程式碼。

後續兩節包含偵錯使用者模式驅動程式和一些一般偵錯提示的步驟。

準備User-Mode偵錯

若要開始偵錯印表機驅動程式及其元件:

  1. 安裝最新的偵錯工具。 請參閱 下載適用于 Windows 的偵錯工具

  2. Windows 符號套件安裝正確的符號

注意

請務必使用最新版本的偵錯工具。

建議您只安裝您有興趣偵錯之元件的已檢查組建。 一般而言,您會以對應的已核取組建取代下列零售二進位檔:

  • Unidrv.dll

  • Unidrvui.dll

  • Unires.dll

您也應該安裝已檢查的 Oemuni 範例組建,或您要偵錯的印表機驅動程式。 使用此方法的優點,而不是安裝整個已檢查的組建系統,就是不會讓整個系統變慢。

啟動User-Mode偵錯會話

若要開始使用者模式偵錯,請在 Windbg 偵錯工具的 [ 檔案 ] 功能表上,選取 [ 附加至進程]。 您附加偵錯工具的程式取決於您嘗試偵錯的案例。 針對印表機驅動程式,您必須將偵錯工具附加至列印應用程式或多工緩衝處理常式 (Spoolsv.exe) 。 請記住,列印應用程式會載入設定/使用者介面模組,而多工緩衝處理常式則會載入轉譯模組。 不過,「FILE:」 列印有差異,其中多工緩衝處理不會發生,因此,列印應用程式也會載入轉譯模組。 因此,您必須確定附加至正確的程式。

注意

您不需要兩部不同的電腦來進行使用者模式偵錯。

下列程式可讓您開始偵錯 Oemuni 範例。

  1. 在 「FILE:」 埠上安裝 Oemuni 範例。

  2. 按一下 [ 開始 ] 功能表、選取 [所有程式]、選取 [配件],然後選取 [WordPad],以啟動 WordPad 應用程式。

  3. 在 [WinDbg 檔案] 功能表上,選取 [ 附加至進程]。 在可用進程清單中,選取 [WordPad.exe]。

  4. 從 WordPad 啟動列印工作。 您現在已準備好偵錯 Oemuni 範例。

您可以開啟 giDebugLevel 變數來啟用詳細資訊偵錯。 其預設值為 3,表示 WARNING。 如果設定為 1,表示 VERBOSE。 若要使用 Unidrv.dll 設定後者的值,請在偵錯工具中輸入下列命令:

> ed unidrv!giDebugLevel 1

當您執行 Oemuni 範例時,也會套用相同的偵錯變數,因此若要啟用詳細資訊偵錯,請輸入下列命令:

> ed oemuni!giDebugLevel 1

您也可以將自己的偵錯語句新增至 Oemuni 範例。

如需設定偵錯值的詳細資訊,請參閱 WinDbg 檔,其中說明可用的命令和設定使用者模式偵錯所需的步驟。 若要存取檔,請在 [WinDbg 說明 ] 功能表上,選取 [內容]。

全域偵錯變數

giDebugLevel 全域變數是由 Oemui 和 Oemuni 範例在其 Debug.h 和 Debug.cpp 檔案中宣告。 giDebugLevel 的值可以透過下列方式修改:

  • 在偵錯工具中變更其值
  • 在外掛程式中重新定義其值

您可以將 giDebugLevel 設定為下列任何值:

#define DBG_VERBOSE 1
#define DBG_TERSE   2
#define DBG_WARNING 3
#define DBG_ERROR   4
#define DBG_RIP     5

偵錯訊息宏

下列宏用於偵錯。 只有在 giDebugLevel 全域變數控制發出偵錯訊息的 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顯示訊息。

VERBOSE ( (msg) )

  • 如果目前的偵錯層級為 < = DBG_VERBOSE,則會以msg顯示訊息。

WARNING ( (msg) )

  • 如果目前的偵錯層級為 < = DBG_WARNING,則會在msg中顯示訊息。 訊息格式為:

    WRN filename (linenumber): msg
    

請注意,具有 msg 引數的所有宏都需要這個引數周圍有一組額外的括弧。 以下是說明此需求的兩個範例:

ASSERTMSG(x > 0, ("x is less than 0\n"));
WARNING( ("App passed NULL pointer, ignoring...\n") );

包含 msg 引數的宏是由 Oemui 和 Oemuni 範例在其 Debug.h 標頭中定義。