共用方式為


偵錯印表機驅動程式元件

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

您可以使用 [偵錯訊息巨集] 區段中討論的巨集,在各種情況下將訊息傳送至調試程序視窗。 此外,您也可以使用本節中的資訊,在Microsoft通用列印機驅動程式 (Unidrv) 或 PostScript 印表機驅動程式 (Pscript) 轉譯器中啟用偵錯訊息,前提是您已檢查這些 DLL 的組建。

備註

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

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

準備 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 全域變數,控制發出偵錯訊息的全局變數設定為特定值時,才會採取動作。 巨集會在未受限的編譯中展開為空白字元。 以下是其用途及其參數的簡短描述。

ASSERTcond

  • 驗證 cond 中的布爾表示式是否為 TRUE。 如果不是,巨集會強制斷點。

ASSERTMSGcond,msg))

  • 驗證 cond 中的布爾表示式是否為 TRUE。 如果不是,巨集會在 msg 中顯示訊息,並觸發斷點。

ERRmsg))

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

    ERR filename (linenumber): msg
    

RIPmsg))

  • msg 中顯示訊息,並使程式強制停在斷點處。

TERSEmsg))

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

VERBOSEmsg))

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

WARNINGmsg))

  • 如果目前的偵錯層級為 <= 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 標頭中定義。