El preprocesador de rastreo de software de Windows ( WPP ; el preprocesador y las herramientas de soporte relacionadas se conocen como rastreo de software WPP ) simplifica el uso del rastreo de eventos WMI para implementar un rastreo de software eficiente en controladores y aplicaciones para Windows 2000 y sistemas operativos posteriores. WPP fue creado por Microsoft y está incluido en el DDK de Windows . Si bien WPP tiene una amplia aplicabilidad, no está incluido en el SDK de Windows y, por lo tanto, se utiliza principalmente para controladores y software de soporte de controladores producidos por proveedores de software que adquieren el DDK de Windows.
Fondo
El rastreo de software es un uso especializado del registro para registrar información sobre la ejecución de un programa. Esta información se usa comúnmente para la depuración . A diferencia del registro de eventos , cuyo propósito principal es producir registros de eventos que pueden ser auditados por administradores de sistemas (véase, por ejemplo, el Visor de eventos ) o analizados por herramientas de administración, el rastreo de software es principalmente una ayuda para la depuración para desarrolladores de software . Por lo tanto, muchos de los requisitos no funcionales del registro de eventos, como la localización o un formato de salida basado en estándares , no son objetivos explícitos para la mayoría de las aplicaciones de rastreo de software. Por otro lado, el rastreo de software tiene requisitos especiales de rendimiento que generalmente no son tan importantes en el registro de eventos. Por ejemplo, un uso común del rastreo de software, el rastreo de entrada/salida , produce una salida en el punto de entrada y retorno de funciones o métodos para que un desarrollador pueda seguir visualmente la ruta de ejecución, a menudo incluyendo parámetros y valores de retorno , en un depurador o un archivo de registro basado en texto (esto puede verse como un análogo en tiempo de ejecución de un diagrama de secuencia ). Este tipo de rastreo, aunque útil para los desarrolladores, puede perjudicar enormemente el rendimiento de un producto de software si no se puede deshabilitar (ya sea en tiempo de compilación mediante compilación condicional o en tiempo de ejecución mediante indicadores ).
Entre las consideraciones adicionales específicas para el rastreo de software se incluyen las siguientes:
- En el software propietario , los datos de seguimiento pueden incluir información confidencial sobre el código fuente del producto .
- Si el rastreo está habilitado o deshabilitado en tiempo de ejecución, muchos métodos de rastreo requieren que se incluya una cantidad significativa de datos adicionales en el binario, lo que puede perjudicar indirectamente el rendimiento incluso cuando el rastreo está deshabilitado.
- Si el rastreo está habilitado o deshabilitado en tiempo de compilación, la obtención de datos de rastreo para un problema en la máquina de un cliente depende de que el cliente esté dispuesto y sea capaz de instalar una versión especial de su software con el rastreo habilitado.
- Ciertos tipos de software, como los controladores, deben cumplir requisitos de rendimiento estrictos incluso con el rastreo habilitado.
Debido a las dos primeras consideraciones, los métodos tradicionales de rastreo de software utilizan la compilación condicional para habilitar o deshabilitar el rastreo (y la inclusión de datos de rastreo) en tiempo de compilación. Por ejemplo, utilizando el preprocesador de C , se podría definir una macro DebugOutde la siguiente manera:
#ifdef _DEBUG #define DebugOut(msg, ...) \ DebugPrintf(__FUNCTION__ "(" __FILE__ ":" TO_STRING(__LINE__) ")\t" \ msg, __VAR_ARGS__) #demás #define DebugOut(msg, ...) #finsidonde TO_STRINGes una macro que convierte el número de línea ( __LINE__) en una cadena y DebugPrintfes una función similar a printf que podría, por ejemplo, mostrar texto al depurador.
A continuación, el siguiente código:
DebugOut("Error %d ocurrido\n", error_code);produciría una salida similar a la siguiente solo en compilaciones de depuración:
Se produjo el error 217 en SomeFunction(file.c:78).
Otra técnica para ciertos tipos de rastreo (en particular, el rastreo de entrada/salida) es el uso de instrumentación . Si bien esta técnica puede abordar muchas de las principales preocupaciones, no siempre está disponible (normalmente solo en código administrado ).
El rastreo de eventos WMI es un ejemplo de tecnología que aborda, en particular, el rendimiento del rastreo en código crítico para el rendimiento, como los controladores. También puede abordar la preocupación de controlar la distribución de información de rastreo sensible, permitiendo que un desarrollador defina los datos de rastreo legibles por humanos ( "Error %d occurred\n"en el ejemplo anterior) por separado del código, de modo que no estén integrados en el producto (en el código, un mensaje específico se referencia por su número de mensaje). Sin embargo, existen algunas limitaciones importantes:
- El rastreo de eventos WMI no puede, por sí solo, generar automáticamente la
"SomeFunction(file.c:78)"parte del mensaje de rastreo. Esta es una limitación común a todas las tecnologías de este tipo, no exclusiva del rastreo de eventos WMI. - Exigir que la parte legible por humanos de los datos de rastreo se separe del código puede disminuir la legibilidad del código.
- El uso de esta técnica puede generar una sobrecarga de desarrollo significativa para los mensajes de rastreo "de un solo uso".
Operación de WPP
WPP se ejecuta antes de la compilación (es decir, incluso antes del preprocesador de C) y genera un encabezado de mensaje de rastreo para cada archivo que procesa (por defecto, este encabezado es filename.tmh, donde filenamees el nombre del archivo fuente procesado). Este encabezado debe incluirse explícitamente en el archivo fuente, por ejemplo:
// Archivo: archivo.cxx // Este archivo es un ejemplo de uso de WPP #incluir "archivo.tmh"
El conocimiento que WPP tiene de la sintaxis de C / C++ es muy limitado. En particular, no expande las macros (salvo en circunstancias especiales donde sea necesario), ni maneja las directivas pragma ni realiza ningún análisis semántico.
Un desarrollador especifica una o más macros de rastreo que WPP debe manejar, mediante un archivo de configuración, anotaciones especiales en comentarios, parámetros de línea de comandos o una combinación de estos métodos. Cada vez que WPP encuentra una de las macros que debe manejar, genera una macro de mensaje de rastreo. En otras palabras, si, por ejemplo, DoTracees una macro de rastreo, WPP generará una macro separada para cada aparición de DoTrace. Las macros de mensaje de rastreo generadas se desambiguan por nombre de archivo y número de línea, y, utilizando varios trucos de preprocesamiento, WPP define a su vez la macro de rastreo original para que expanda la macro de mensaje de rastreo apropiada en cada aparición.
La generación de macros de mensajes de seguimiento por parte de WPP depende de un archivo de plantilla (cuyo formato no está documentado). Los archivos de plantilla predeterminados incluidos con WPP especifican que la cadena de un mensaje de seguimiento debe incluirse en una anotación (mediante la función `__annotation` del compilador de Microsoft). Estas cadenas no se incluyen en el código compilado, sino en el archivo de símbolos del depurador en un formato que las herramientas incluidas en WPP pueden interpretar. Las macros de mensajes de seguimiento también incluyen la lógica para habilitar o deshabilitar el seguimiento mediante indicadores y las llamadas a las API de seguimiento de eventos de WMI.
Limitaciones
- Dado que WPP no expande las macros, no reconocerá una instancia de una macro de rastreo que esté incluida en la definición de otra macro. Por ejemplo, si
DoTracees una macro de rastreo y una macroCheckForErrorsse define como:
#define CheckForErrors(error_code) \ si (IsError(código_de_error)) \ { \ DoTrace("Error %d ocurrido\n", err); ManejarError(código_de_error); }Entonces, WPP no generará las macros de mensajes de seguimiento DoTracedonde CheckForErrorsocurra el problema. WPP proporciona una solución alternativa para este problema, pero aún existe una pequeña clase de macros que no se pueden expresar incluso utilizando dicha solución.
- El archivo de plantilla predeterminado genera código que solo funcionará correctamente con el compilador de Microsoft. Si bien esto no es una limitación inherente del preprocesador, el hecho de que el archivo de plantilla (que controla el código que se genera en el encabezado del mensaje de seguimiento) utilice un formato no documentado significa que, en la práctica, WPP solo funcionará correctamente con el compilador de Microsoft.
- Las versiones anteriores de WPP provocaban errores de compilación cuando se incluía más de una cabecera de macro de rastreo en un archivo fuente (por ejemplo, si un archivo fuente con rastreo incluía una cabecera con rastreo en funciones en línea). Este problema se ha solucionado en la versión más reciente. Cabe destacar que esta limitación también reside en el archivo de plantilla, no en la herramienta WPP en sí.
- Debido a que las macros de mensajes de seguimiento se desambiguan por número de archivo y de línea, solo puede haber una macro de seguimiento por línea en el código fuente.
Referencias
Enlaces externos
- Referencia de rastreo de software de WPP en MSDN
- Software de Microsoft
- Administración de Windows
- Componentes de Windows
- Depuración