Compartir a través de


Depuración de componentes del controlador de impresora

Si está desarrollando un complemento de representación de controladores de impresora o un complemento de interfaz de usuario, puede habilitar los mensajes de depuración en estos componentes. Como se explica en la sección Variable de depuración global, puede usar una variable de depuración global para controlar el nivel de detalle de los mensajes que aparecen en la ventana del depurador.

Puede usar las macros que se describen en la sección Depurar macros de mensaje para enviar mensajes a la ventana del depurador en una variedad de condiciones. Además, puede usar la información de esta sección para habilitar los mensajes de depuración en los representadores del controlador de impresora universal de Microsoft (Unidrv) o del controlador de impresora PostScript (Pscript), siempre que haya comprobado las compilaciones de estos archivos DLL.

Nota:

Las compilaciones comprobadas estaban disponibles en versiones anteriores de Windows, antes de Windows 10 versión 1803. Use herramientas como Comprobador de controladores y GFlags para comprobar el código de controlador en versiones posteriores de Windows.

Los pasos para depurar un controlador en modo de usuario y algunas sugerencias generales de depuración se incluyen en las dos secciones siguientes.

Preparación para la depuración de User-Mode

Para iniciar la depuración de controladores de impresora y sus componentes:

  1. Instale las herramientas de depuración más recientes. Consulte Descargar herramientas de depuración para Windows.

  2. Instalar los símbolos correctos desde paquetes de símbolos de Windows

Nota:

Es muy importante usar la versión más reciente del depurador.

Es aconsejable instalar la compilación comprobada de solo los componentes que le interesen en la depuración. Normalmente, reemplazaría los siguientes archivos binarios comerciales por sus compilaciones comprobadas correspondientes:

  • Unidrv.dll

  • Unidrvui.dll

  • Unires.dll

También debe instalar la compilación comprobada del ejemplo Oemuni o el controlador de impresora que está depurando. La ventaja de usar este enfoque, en lugar de instalar un sistema de compilación comprobado completo, es que no ralentizará todo el sistema.

Iniciar una sesión de depuración de User-Mode

Para comenzar la depuración en modo de usuario, en el menú Archivo del depurador de Windbg, seleccione Asociar a un proceso. El proceso al que asocia el depurador depende del escenario en el que intenta depurar. Para los controladores de impresora, debe adjuntar el depurador a la aplicación de impresión o al proceso de cola (Spoolsv.exe). Tenga en cuenta que la aplicación de impresión carga el módulo de interfaz de usuario o configuración, mientras que el proceso de cola carga el módulo de representación. Sin embargo, hay diferencias en la impresión "FILE:", donde la creación de colas no tiene lugar y, como resultado, la aplicación de impresión también carga el módulo de representación. Por lo tanto, debe asegurarse de adjuntar al proceso correcto.

Nota:

No necesita dos máquinas independientes para la depuración en modo de usuario.

El procedimiento siguiente le preparará para depurar el ejemplo oemuni.

  1. Instale el ejemplo oemuni en el puerto "FILE:".

  2. Inicie la aplicación WordPad haciendo clic en el menú Inicio , seleccionando Todos los programas, Accesorios y WordPad.

  3. En el menú Archivo winDbg , seleccione Asociar a un proceso. En la lista de procesos disponibles, seleccione WordPad.exe.

  4. Inicie un trabajo de impresión desde WordPad. Ya está listo para depurar el ejemplo de Oemuni.

Puede habilitar la depuración detallada activando la variable giDebugLevel. Su valor predeterminado es 3, que indica WARNING. Si se establece en 1, indica VERBOSE. Para establecer el último valor con Unidrv.dll, escriba el siguiente comando en el depurador:

> ed unidrv!giDebugLevel 1

Cuando se ejecuta el ejemplo oemuni, también se aplica la misma variable de depuración, por lo que para habilitar la depuración detallada, escriba el siguiente comando:

> ed oemuni!giDebugLevel 1

También puede agregar sus propias instrucciones de depuración al ejemplo oemuni.

Para obtener más información sobre cómo establecer valores de depuración, consulte la documentación de WinDbg, que describe los comandos disponibles y describe los pasos necesarios para configurar la depuración en modo de usuario. Para acceder a la documentación, en el menú Ayuda de WinDbg, seleccione Contenido.

Variable de depuración global

Los ejemplos de Oemui y Oemuni declaran la variable global giDebugLevel en sus archivos Debug.h y Debug.cpp. El valor de giDebugLevel se puede modificar mediante:

  • Cambio de su valor en el depurador
  • Redefinir su valor en el complemento

Puede establecer giDebugLevel en cualquiera de los valores siguientes:

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

Depurar macros de mensaje

Las macros siguientes se usan con fines de depuración. Varios de ellos toman medidas solo si la variable global giDebugLevel, que controla qué mensajes de depuración se emiten, se establece en un valor específico. Las macros se expanden a espacios en blanco en una compilación gratuita. Estas son breves descripciones de lo que hacen y sus parámetros.

ASSERT(cond)

  • Comprueba si la expresión booleana en cond es TRUE. Si no es así, la macro fuerza un punto de interrupción.

ASSERTMSG(cond, (msg))

  • Comprueba si la expresión booleana en cond es TRUE. Si no es así, la macro muestra el mensaje en msg y fuerza un punto de interrupción.

ERR((msg))

  • Muestra el mensaje en msg si el nivel de depuración actual es <= DBG_ERROR. El formato del mensaje es:

    ERR filename (linenumber): msg
    

RIP((msg))

  • Muestra el mensaje en msg y fuerza un punto de interrupción.

TERSE((msg))

  • Muestra el mensaje en msg si el nivel de depuración actual es <= DBG_TERSE.

VERBOSE((msg))

  • Muestra el mensaje en msg si el nivel de depuración actual es <= DBG_VERBOSE.

WARNING((msg))

  • Muestra el mensaje en msg si el nivel de depuración actual es <= DBG_WARNING. El formato del mensaje es:

    WRN filename (linenumber): msg
    

Tenga en cuenta que todas las macros con un argumento msg requieren un par de paréntesis adicional que rodea este argumento. Estos son dos ejemplos que ilustran este requisito:

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

Las macros que contienen un argumento msg se definen mediante los ejemplos oemui y Oemuni en sus encabezados Debug.h.