Un poco de Byteman: Primeros Pasos

Byteman es un herramienta creada por la comunidad JBoss.org que nos ayuda a tracear, monitorizar y testar el comportamiento de una aplicción Java.

Para esto inyecta código Java en los métodos Java sin la necesidad de recompilar, reempaquetar o redesplegar la aplicación. La inyección puede hacerse en el arranque de la JVM o incluso mientras la aplicación está ejecutando. Además el código inyectado puede acceder a los datos y llamar a otros métodos (includo métodos privados).

Byteman funciona modificando el bytecode de las clases de la aplicación en runtime. A diferencia de otras librerías Byteman opera a nivel de Java, definiendo las reglas que especifican el código a modificar. Byteman es capaz de modificar el código de cualquier librería, incluso de las librerías del runtime de la JVM.

Dicho esto, seguro que le encontráis numerosos usos a Byteman, ¿verdad?

El uso más simple de Byteman es inyectar sentencias de log para lo que está haciendo la aplicación, mostrar el valor de ciertos datos,…de modo que se pueda monitorizar y debugear nuestras aplicaciones en ejecución. Además usar Byteman tiene la ventaja de no afectar al rendimiento al no tener que modificar el código para poner trazas.

Veamos cómo se usa

  1. Comenzaremos por descargar el binario de Byteman (Byteman 4.0.11) que es un ZIP y descomprimirlo en una carpeta.
  2. Luego establecemos una variable BYTEMAN_HOME apuntando a esta carpeta y la añadimos al %PATH% el %BYTEMAN_HOME%/bin
  3. Ya podemos probarlo, primero un ejemplo sencillo, escribimos una clase sencillita:

  1. La compilamos y la ejecutamos

  1. Ahora nos queda escribir la RULE Byteman, la llamaré BytemanFirstRule.btm y La dejaré en la misma carpeta

  1. La regla tendrá este aspecto (la pongo tabulada para que se lea mejor pero no es necesario):

Como se puede ver la regla tiene 2 reglas, una que se ejecuta a la entrada del método main y otra a la salida:

  1. Ahora ya puedo ejecutarla, simplemente añadiendo el javaagent y la ruta al script:

java -javaagent:%BYTEMAN_HOME%/lib/byteman.jar=script:BytemanFirstRule.btm BytemanFirstExample uno dos tres

Esto está bien, ¿pero es todo?

Nooooooo!!! Veamos un caso más complejo.

Primero la clase:

Y mi fichero btm

En este caso quiero inyectar código en la clase Thread así que la forma de lanzarlo es un poco más compleja:

java -javaagent:%BYTEMAN_HOME%libbyteman.jar=script:BytemanThreadRule.btm,boot:%BYTEMAN_HOME%libbyteman.jar -Dorg.jboss.byteman.transform.all BytemanThreadExample Hilo1 Hilo2 Hilo3

En el próximo post (este miércoles o jueves si el CoronaVirus no lo impide!!!) veremos cómo cargar y descargar Reglas sobre un programa en ejecución! 😉

3 comentarios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s