Поделиться через


Отладка компонентов драйвера принтера

При разработке подключаемого модуля отрисовки драйвера принтера или подключаемого модуля пользовательского интерфейса можно включить сообщения отладки в этих компонентах. Как описано в разделе Глобальная переменная отладки, можно использовать глобальную переменную отладки для управления уровнем детализации сообщений, отображаемых в окне отладчика.

Макросы, рассмотренные в разделе Макросы сообщений отладки, можно использовать для отправки сообщений в окно отладчика при различных условиях. Кроме того, вы можете использовать сведения в этом разделе, чтобы включить сообщения отладки в отрисовщиках драйвера принтера 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:, в которых не выполняется spooling и в результате модуль отрисовки также загружается приложением печати. Поэтому необходимо убедиться, что вы подключаетесь к правильному процессу.

Примечание

Для отладки в пользовательском режиме не требуются два отдельных компьютера.

Следующая процедура поможет вам подготовиться к отладке примера Oemuni.

  1. Установите пример Oemuni на порт FILE:.

  2. Запустите приложение WordPad, щелкнув меню Пуск , выбрав Все программы, Стандартные и WordPad.

  3. В меню Файл WinDbg выберите Присоединиться к процессу. В списке доступных процессов выберите WordPad.exe.

  4. Запустите задание печати из WordPad. Теперь все готово для отладки примера Oemuni.

Вы можете включить подробную отладку, включив переменную giDebugLevel. Значение по умолчанию — 3, которое обозначает ПРЕДУПРЕЖДЕНИЕ. Если задано значение 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, определяющей, какие сообщения отладки выдаются, задано определенное значение. Макросы расширяются до пробелов в свободной сборке. Ниже приведены краткие описания действий и их параметров.

ASSERT(cond)

  • Проверяет, имеет ли логическое выражение в condзначение TRUE. Если это не так, макрос принудительно создает точку останова.

ASSERTMSG(cond, (msg))

  • Проверяет, имеет ли логическое выражение в condзначение TRUE. Если это не так, макрос отображает сообщение в msg и принудительно создает точку останова.

ERR((msg))

  • Отображает сообщение в msg, если текущий уровень отладки = <DBG_ERROR. Формат сообщения:

    ERR filename (linenumber): msg
    

RIP((msg))

  • Отображает сообщение в msg и принудительно создает точку останова.

TERSE((msg))

  • Отображает сообщение в msg, если текущий уровень отладки = <DBG_TERSE.

VERBOSE((msg))

  • Отображает сообщение в msg, если текущий уровень отладки = <DBG_VERBOSE.

WARNING((msg))

  • Отображает сообщение в msg , если текущий уровень отладки = <DBG_WARNING. Формат сообщения:

    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.