nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Bytemanクイックリファレンス

JBoss Advent Calendar 2011の26日目のエントリです。Bytemanの組み込み変数とかすぐ忘れてしまってBytemanのリファレンスPDFドキュメントを開くハメになることが多いので主要な部分を抜き出してみました。

基本構造

RULE
CLASS
METHOD
HELPER
AT
BIND
IF
DO
ENDRULE

ルールリファレンス

  • CLASS
    • CLASS
    • INTERFACE
    • サブクラスもターゲットにしたい場合は^を付与して ^ClassName または ^InterfaceName
  • METHOD
    • METHOD
    • カッコ省略すると引数に関係なくマッチ
    • コンストラクタは特殊なメソッド名 <init> を指定
  • AT
    • AT ENTRY|EXIT|LINE|READ|WRITE|INVOKE|SYNCHRONIZE|THROW
    • AFTER READ|WRITE|INVOKE|SYNCHRONIZE|THROW

変数リファレンス

  • $this
    • Javaのthisと一緒
  • $0
    • $thisと一緒
  • $1, $2, $3...
    • メソッドパラメータ
  • $!
    • リターン値、AT EXITかAFTER INVOKEのみ有効
  • $^
    • スローされた例外、AT THROWで有効
  • $#
    • メソッドのパラメータ数
  • $*
    • $0, $1, $2...の配列表現
  • $@
    • 呼び出し対象メソッドに対する$0, $1, $2...の配列表現、AT INVOKEで有効
  • $foobar
    • 同名の変数参照

その他注意点

  • パラメータ数
    • METHODにパラメータを定義せず、メソッドパラメータ変数$1, $2, $3をDOの中で利用している場合、メソッドパラメータ数が一致してないとトリガされない
  • ローカル変数の変数名による参照

有効にするときのShell Script

BYTEMAN_HOME=/path/to/byteman-download-1.6.0
BYTEMAN_RULE=/path/to/byteman.rule
BYTEMAN_OPTS="-javaagent:$BYTEMAN_HOME/lib/byteman.jar=listener:true,boot:$BYTEMAN_HOME/lib/byteman.jar"
if [ "x$BYTEMAN_RULE" != "x" ]; then
   BYTEMAN_OPTS="${BYTEMAN_OPTS},script:$BYTEMAN_RULE"
fi
BYTEMAN_OPTS="$BYTEMAN_OPTS -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.debug"

JAVA_OPTS="$BYTEMAN_OPTS $JAVA_OPTS"