Freigeben über


Debuggen von Druckertreiberkomponenten

Wenn Sie ein Druckertreiber-Rendering-Plug-In oder ein Benutzeroberflächen-Plug-In entwickeln, können Sie Debugmeldungen in diesen Komponenten aktivieren. Wie im Abschnitt Globale Debugvariable erläutert, können Sie eine globale Debugvariable verwenden, um den Detailgrad in Meldungen zu steuern, die im Debuggerfenster angezeigt werden.

Sie können die im Abschnitt Debuggen von Nachrichtenmakros beschriebenen Makros verwenden, um unter verschiedenen Bedingungen Nachrichten an das Debuggerfenster zu senden. Darüber hinaus können Sie die Informationen in diesem Abschnitt verwenden, um Debugmeldungen in den Renderern des Microsoft Universal Printer Driver (Unidrv) oder des PostScript-Druckertreibers (Pscript) zu aktivieren, sofern Sie die Builds dieser DLLs überprüft haben.

Hinweis

Überprüfte Builds waren unter älteren Versionen von Windows verfügbar, bevor Windows 10 Version 1803. Verwenden Sie Tools wie Driver Verifier und GFlags, um Treibercode in späteren Versionen von Windows zu überprüfen.

Schritte zum Debuggen eines Benutzermodustreibers und einige allgemeine Tipps zum Debuggen sind in den nächsten beiden Abschnitten enthalten.

Vorbereiten des User-Mode Debuggens

So starten Sie das Debuggen von Druckertreibern und deren Komponenten:

  1. Installieren Sie die neuesten Debugtools. Weitere Informationen finden Sie unter Herunterladen von Debugtools für Windows.

  2. Installieren der richtigen Symbole aus Windows-Symbolpaketen

Hinweis

Es ist sehr wichtig, dass Sie die neueste Version des Debuggers verwenden.

Es empfiehlt sich, den überprüften Build nur der Komponenten zu installieren, die Sie debuggen möchten. In der Regel ersetzen Sie die folgenden Einzelhandelsbinärdateien durch die entsprechenden überprüften Builds:

  • Unidrv.dll

  • Unidrvui.dll

  • Unires.dll

Sie sollten auch den überprüften Build des Oemuni-Beispiels oder des Druckertreibers installieren, den Sie debuggen. Der Vorteil dieses Ansatzes im Gegensatz zur Installation eines gesamten überprüften Buildsystems besteht darin, dass Sie nicht das gesamte System verlangsamen.

Starten einer User-Mode Debugsitzung

Um mit dem Debuggen im Benutzermodus zu beginnen, wählen Sie im Windbg-Debugger im Menü Datei die Option An einen Prozess anfügen aus. Der Prozess, an den Sie den Debugger anfügen, hängt von dem Szenario ab, das Sie debuggen möchten. Bei Druckertreibern müssen Sie den Debugger entweder an die Druckanwendung oder an den Spoolerprozess (Spoolsv.exe) anfügen. Beachten Sie, dass die Druckanwendung das Konfigurations-/Benutzeroberfläche-Modul lädt, während der Spoolerprozess das Renderingmodul lädt. Es gibt jedoch Unterschiede für den "FILE:"-Druck, bei dem das Spooling nicht stattfindet und daher das Renderingmodul auch von der Druckanwendung geladen wird. Sie müssen daher sicherstellen, dass Sie den richtigen Prozess anfügen.

Hinweis

Sie benötigen keine zwei separaten Computer für das Debuggen im Benutzermodus.

Mit dem folgenden Verfahren können Sie das Oemuni-Beispiel debuggen.

  1. Installieren Sie das Oemuni-Beispiel am Port "FILE:".

  2. Starten Sie die WordPad-Anwendung, indem Sie auf das Startmenü klicken, Alle Programme, Zubehör und dann WordPad auswählen.

  3. Wählen Sie im Menü WinDbg-Dateidie Option An einen Prozess anfügen aus. Wählen Sie in der Liste der verfügbaren Prozesse WordPad.exeaus.

  4. Starten Sie einen Druckauftrag über WordPad. Sie können jetzt das Oemuni-Beispiel debuggen.

Sie können ausführliches Debuggen aktivieren, indem Sie die Variable giDebugLevel aktivieren. Der Standardwert ist 3, was WARNUNG angibt. Wenn sie auf 1 festgelegt ist, bedeutet dies VERBOSE. Geben Sie den folgenden Befehl in den Debugger ein, um den letztgenannten Wert mit Unidrv.dll festzulegen:

> ed unidrv!giDebugLevel 1

Wenn Sie das Oemuni-Beispiel ausführen, gilt die gleiche Debugvariable. Geben Sie also den folgenden Befehl ein, um ausführliches Debuggen zu aktivieren:

> ed oemuni!giDebugLevel 1

Sie können dem Oemuni-Beispiel auch eigene Debuganweisungen hinzufügen.

Weitere Informationen zum Festlegen von Debugwerten finden Sie in der WinDbg-Dokumentation, in der die verfügbaren Befehle beschrieben und die schritte beschrieben werden, die zum Einrichten des Debuggens im Benutzermodus erforderlich sind. Um auf die Dokumentation zuzugreifen, wählen Sie im Menü WinDbg-Hilfe die Option Inhalt aus.

Globale Debugvariable

Die globale Variable giDebugLevel wird von den Beispielen Oemui und Oemuni in den Dateien Debug.h und Debug.cpp deklariert. Der Wert von giDebugLevel kann wie folgt geändert werden:

  • Ändern des Werts im Debugger
  • Neudefinition des Werts im Plug-In

Sie können giDebugLevel auf einen der folgenden Werte festlegen:

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

Debuggen von Nachrichtenmakros

Die folgenden Makros werden zu Debugzwecken verwendet. Einige von ihnen werden nur dann aktiv, wenn die globale Variable giDebugLevel, die steuert, welche Debugnachrichten ausgegeben werden, auf einen bestimmten Wert festgelegt ist. Die Makros werden in einem kostenlosen Build zu Leerzeichen erweitert. Hier finden Sie eine kurze Beschreibung ihrer Aufgaben und ihrer Parameter.

ASSERT(cond)

  • Überprüft, ob der boolesche Ausdruck in condTRUE ist. Andernfalls erzwingt das Makro einen Haltepunkt.

ASSERTMSG(cond, (msg))

  • Überprüft, ob der boolesche Ausdruck in condTRUE ist. Andernfalls zeigt das Makro die Nachricht in msg an und erzwingt einen Haltepunkt.

ERR((msg))

  • Zeigt die Meldung in msg an, wenn die aktuelle Debugebene = DBG_ERROR ist <. Das Nachrichtenformat lautet:

    ERR filename (linenumber): msg
    

RIP((msg))

  • Zeigt die Nachricht in msg an und erzwingt einen Haltepunkt.

TERSE((msg))

  • Zeigt die Meldung in msg an, wenn die aktuelle Debugebene = DBG_TERSE ist <.

VERBOSE((msg))

  • Zeigt die Meldung in msg an, wenn die aktuelle Debugebene = DBG_VERBOSE ist <.

WARNING((msg))

  • Zeigt die Meldung in msg an, wenn die aktuelle Debugebene = DBG_WARNING ist <. Das Nachrichtenformat lautet:

    WRN filename (linenumber): msg
    

Beachten Sie, dass alle Makros mit einem msg-Argument ein zusätzliches Paar von Klammern um dieses Argument erfordern. Hier sind zwei Beispiele, die diese Anforderung veranschaulichen:

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

Die Makros, die ein msg-Argument enthalten, werden durch die Beispiele Oemui und Oemuni in ihren Debug.h-Headern definiert.