Отладка компонентов драйвера принтера
При разработке подключаемого модуля отрисовки драйвера принтера или подключаемого модуля пользовательского интерфейса можно включить сообщения отладки в этих компонентах. Как описано в разделе Глобальная переменная отладки, можно использовать глобальную переменную отладки для управления уровнем детализации сообщений, отображаемых в окне отладчика.
Макросы, рассмотренные в разделе Макросы сообщений отладки, можно использовать для отправки сообщений в окно отладчика при различных условиях. Кроме того, вы можете использовать сведения в этом разделе, чтобы включить сообщения отладки в отрисовщиках драйвера принтера Microsoft Universal Printer Driver (Unidrv) или PostScript Printer Driver (Pscript) при условии, что вы проверили сборки этих библиотек DLL.
Примечание
Проверенные сборки были доступны в более ранних версиях Windows до Windows 10 версии 1803. Используйте такие средства, как Средство проверки драйверов и GFlags, для проверка кода драйвера в более поздних версиях Windows.
Действия по отладке драйвера пользовательского режима и некоторые общие советы по отладке приведены в следующих двух разделах.
Подготовка к отладке User-Mode
Чтобы начать отладку драйверов принтера и их компонентов, выполните следующие действия.
Установите последнюю версию средств отладки. См . статью Скачивание средств отладки для Windows.
Установка правильных символов из пакетов символов Windows
Примечание
Очень важно использовать последнюю версию отладчика.
Рекомендуется установить проверенную сборку только для компонентов, которые вас интересуют в отладке. Как правило, следующие двоичные файлы розничной торговли заменяются соответствующими проверенными сборками:
Unidrv.dll
Unidrvui.dll
Unires.dll
Также следует установить проверенную сборку примера Oemuni или отлаживаемый драйвер принтера. Преимущество использования этого подхода, в отличие от установки всей проверенной системы сборки, заключается в том, что вы не замедлите работу всей системы.
Запуск сеанса отладки User-Mode
Чтобы начать отладку в пользовательском режиме, в меню Файл в отладчике Windbg выберите Присоединиться к процессу. Процесс, к которому подключается отладчик, зависит от сценария, который вы пытаетесь отладить. Для драйверов принтера необходимо подключить отладчик либо к приложению печати, либо к процессу очереди печати (Spoolsv.exe). Имейте в виду, что приложение печати загружает модуль конфигурации или пользовательского интерфейса, а процесс очереди очереди загружает модуль отрисовки. Однако существуют отличия при печати file:, в которых не выполняется spooling и в результате модуль отрисовки также загружается приложением печати. Поэтому необходимо убедиться, что вы подключаетесь к правильному процессу.
Примечание
Для отладки в пользовательском режиме не требуются два отдельных компьютера.
Следующая процедура поможет вам подготовиться к отладке примера Oemuni.
Установите пример Oemuni на порт FILE:.
Запустите приложение WordPad, щелкнув меню Пуск , выбрав Все программы, Стандартные и WordPad.
В меню Файл WinDbg выберите Присоединиться к процессу. В списке доступных процессов выберите WordPad.exe.
Запустите задание печати из 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.