language-agnostic definition instrumentation

language agnostic - ¿Qué es la instrumentación?



language-agnostic definition (5)

He escuchado que este término se usa mucho en el mismo contexto que el registro, pero no puedo encontrar una definición clara de lo que realmente es.

¿Es simplemente una clase más general de herramientas y actividades de registro / monitoreo?

Por favor, proporcione código / escenarios de ejemplo cuando / cómo debe usarse la instrumentación.


Es un término general para hacer algo a su código necesario para un análisis más a fondo.

Especialmente para lenguajes como C o C ++, existen herramientas como Purificar o Cuantificar el uso de memoria de perfil, estadísticas de rendimiento y similares. Para hacer que esos programas de perfilado funcionen correctamente, es necesario un paso de "instrumentación" para insertar los contadores, las verificaciones de límites de matriz, etc. que utilizan los programas de perfilado. Tenga en cuenta que en el escenario Purificar / Cuantificar, la instrumentación se realiza automáticamente como un paso posterior a la compilación (en realidad, es un paso adicional al proceso de vinculación) y no toca su código fuente.

Algo de eso es menos necesario con el código dinámico o VM (es decir, las herramientas de creación de perfiles como OptimizeIt están disponibles para Java que hace mucho de lo que Quantify hace, pero no se requiere un enlace especial) pero eso no niega el concepto.


Escribo herramientas que realizan instrumentación. Así que aquí está lo que creo que es.

  • Reescritura de DLL. Esto es lo que hacen las herramientas como Purificar y Cuantificar. Una respuesta previa a esta pregunta dijo que se instrumentan después de la compilación / enlace. Eso no es correcto. Purifique y cuantifique el instrumento la DLL la primera vez que se ejecuta después de un ciclo de compilación / enlace, luego almacene en caché el resultado para que pueda usarse más rápidamente la próxima vez. Para aplicaciones grandes, la creación de perfiles de las DLL puede llevar mucho tiempo. También es problemático: en una empresa en la que trabajé entre 1998 y 2000, tuvimos una gran aplicación de 2 millones de líneas que tardaría 4 horas en instrumentar, y 2 de las DLL se bloquearían aleatoriamente durante la instrumentación y, si fallaba, tendríamos que eliminar ambos, luego empezar de nuevo.

  • Instrumentación in situ. Esto es similar a la reescritura de DLL, excepto que la DLL no se modifica y la imagen en el disco permanece intacta. Las funciones de la DLL se conectan adecuadamente a la tarea requerida cuando la DLL se carga por primera vez (ya sea durante el inicio o después de una llamada a LoadLibrary (Ex). Puede ver técnicas similares a esta en la biblioteca de Microsoft Detours.

  • Instrumentación sobre la marcha. Al igual que en el lugar, pero solo en realidad instruye un método la primera vez que se ejecuta el método. Esto es más complejo que en el lugar y retrasa la penalización de la instrumentación hasta la primera vez que se encuentra el método. Dependiendo de lo que estés haciendo, eso podría ser algo bueno o malo.

  • La instrumentación del lenguaje intermedio. Esto es lo que se hace a menudo con los lenguajes Java y .Net (C ~, VB.Net, F #, etc.). El lenguaje se compila a un lenguaje intermedio que luego es ejecutado por una máquina virtual. La máquina virtual proporciona una interfaz (JVMTI para Java, ICorProfiler (2) para .Net) que le permite monitorear lo que está haciendo la máquina virtual. Algunas de estas opciones le permiten modificar el lenguaje intermedio justo antes de que se compile en instrucciones ejecutables.

  • La instrumentación del lenguaje intermedio a través de la reflexión. Java y .Net proporcionan API de reflexión que permiten el descubrimiento de metadatos sobre los métodos. Utilizando estos datos, puede crear nuevos métodos sobre la marcha e instrumentar métodos existentes al igual que con la instrumentación de lenguaje intermedio mencionada anteriormente.

  • Compilación de instrumentos de tiempo. Esta técnica se utiliza en tiempo de compilación para insertar instrucciones apropiadas en la aplicación durante la compilación. No es de uso frecuente, una característica de creación de perfiles de Visual Studio proporciona esta característica. Requiere una reconstrucción completa y un enlace.

  • Código fuente de instrumentación. Esta técnica se usa para modificar el código fuente para insertar el código apropiado (generalmente compilado condicionalmente para que pueda desactivarlo).

  • Instrumentación de tiempo de enlace. Esta técnica solo es realmente útil para reemplazar los asignadores de memoria predeterminados con asignadores de seguimiento. Un ejemplo temprano de esto fue el detector de fugas de memoria Sentinel en Solaris / HP a principios de los años noventa.

Los diversos métodos de instrumentación en el lugar y sobre la marcha están plagados de peligros, ya que es muy difícil detener todos los subprocesos de manera segura y modificar el código sin correr el riesgo de requerir una llamada API que puede querer acceder a un bloqueo que se mantiene por un hilo que acabas de pausar, no quieres hacer eso, obtendrás un punto muerto. También tienes que verificar si alguno de los otros subprocesos está ejecutando ese método, porque si lo están, no puedes modificarlo.

Los métodos de instrumentación basados ​​en la máquina virtual son mucho más fáciles de usar, ya que la máquina virtual garantiza que puede modificar el código de forma segura en ese momento.

  • (EDITAR - este artículo se agregó más adelante) IAT enganche la instrumentación. Esto implicó la modificación de la tabla de importación para funciones vinculadas en otras DLL / Bibliotecas compartidas. Este tipo de instrumentación es probablemente el método más simple para trabajar, no necesita saber cómo desmontar y modificar los binarios existentes, o hacer lo mismo con los códigos de operación de la máquina virtual. Simplemente parchea la tabla de importación con su propia dirección de función y llama a la función real desde su gancho. Utilizado en muchas herramientas comerciales y de código abierto.

Creo que los he cubierto todos, espero que ayude.


Independientemente de lo que diga Wikipedia, no existe una definición estándar / ampliamente aceptada para la instrumentación de códigos en la industria de TI.

Tenga en cuenta que la instrumentación es un sustantivo derivado de un instrumento que tiene un significado muy amplio.

" Código " es también todo en TI, me refiero a datos, servicios, todo.

Por lo tanto, la instrumentación de códigos es un conjunto de aplicaciones que es tan amplio ... que no vale la pena darle un nombre separado ;-).

Probablemente por eso este artículo de Wikipedia es solo un trozo.


La instrumentación se utiliza generalmente en el análisis de código dinámico.

se diferencia del registro ya que la instrumentación generalmente se realiza automáticamente mediante el software, mientras que el registro necesita inteligencia humana para insertar el código de registro.


Un extracto del artículo de wikipedia

En el contexto de la programación de computadoras, la instrumentación se refiere a la capacidad de monitorear o medir el nivel de desempeño de un producto, diagnosticar errores y escribir información de rastreo. Los programadores implementan la instrumentación en forma de instrucciones de código que monitorean componentes específicos en un sistema (por ejemplo, las instrucciones pueden hacer que la información de registro aparezca en la pantalla). Cuando una aplicación contiene código de instrumentación, se puede administrar mediante una herramienta de administración. La instrumentación es necesaria para revisar el rendimiento de la aplicación. Los enfoques de instrumentación pueden ser de dos tipos, instrumentación de origen e instrumentación binaria.