谷本 心 in せろ部屋 このページをアンテナに追加 RSSフィード

2009-07-14

[]やばくねっ!? BTraceに「unsafe」モード搭載!

JavaOneの時にBTraceのセッションをやっていた人(Sundararajanじゃないけど)に

unsafeなことをやりたいって言ったら「自分でやるしかないね」って言われたんだけど

それがオフィシャルに出来るようになったらしい。

In "unsafe" mode BTrace permits all Java constructs and also allows calls to arbitrary code. Like every other unsafe facility in programming, you are on own your own with this facility!

BTrace "unsafe" mode - A. Sundararajan’s Weblog

BTraceから独自のインスタンスを作れるようになるし、任意のメソッド呼び出しもOK。

要するに、BTraceを「簡単なコンソール向けJava解析ツールのサポートツール」から

「Bytecode Instrumentとオンデマンドアタッチのプラットフォーム」とみなせるようになったって事。


これはありがたい。

なんか解析ツールを一本作りたい気分になってきた。

2009-02-20

[]BTraceで任意の処理を行うための裏技。

BTraceってもうちょっと任意のメソッドを呼べれば良いのになー的に思ってる

数少ないBTraceマニアに向けた裏技。


1. 任意のパッケージにBTraceUtilsっていう名前のクラスを作る。

2. そのクラスに、com.sun.btrace.BTraceUtilsにあるメソッドと同じ名前で、

  引数の数が一致するメソッドを作る。

3. それを呼ぶ。


BTraceのVerifierがクラス名とメソッドのシグニチャでチェックしている事を

逆手に取った裏技です。完全に非推奨ですね。


って、コンパイル(btracec)が上手くいくことまでは試しましたが、

実際に動作させるところは試していません。

多分、アタッチする時に自前でクラスを流し込まなきゃいけないはずです。

2009-02-17

[]普通にjavacしたクラスをBTraceに食わせるとどうなるか?

ちなみに、com.sun.btrace.compiler.Compilerも、凝った実装をしているわけではなくて

Compiler APIを叩く時に、com.sun.btrace.compiler.Verifierという

BTrace独自のソースコードチェックを行っているだけだった。


このVerifierこそが、BTraceの一つの肝である「安全性」、

つまり「刺した時にアプリを壊さないために、強い制限を掛ける」ってことを

実現しているもので、BTraceの制限を緩めたいなら、

このVerifierを自前のものに差し替えてしまえば良さそうだ。

BTraceのコンパイラは何をやっているのか? - せろ部屋

Verifierを自前のものに差し替える、、、というか、

いっそのことjavacしたクラスをBTraceに食わせるとどうなるか試してみました。


、、、結果は撃沈。BTraceのVerifyErrorが発生しました。

どうやらバイトコード書き換えを行うタイミングでも、

クラスの内容チェックを行っているようです。


ここも含めて回避するのは面倒くさそうなので、いったん諦めます。

2009-02-12

[][]BTraceとJGraphで簡単シーケンス図作成ツール

せっかくの祝日を活かし、シーケンス図作成ツールを作っちゃいました。

論より証拠、スクリーンキャプチャで見ていきましょう。


起動直後の様子。ただのSwingアプリですね。

f:id:cero-t:20090213003036p:image

ちなみにこの画面はNetBeansのGUIビルダー(Matisse)で作りました。サクサクです。


ドロップダウンリストを開くと、Javaのプロセス一覧が選択できます。

f:id:cero-t:20090213003035p:image

今回はTomcatのプロセスを解析しましょうか。


解析対象クラスを正規表現で記述します。tutorialパッケージ以下の全クラスにしましょう。

f:id:cero-t:20090213003034p:image

記述したら、Startを押します。


これでBTraceによるトレースが行われるので、解析対象のアプリケーションをしばらく動かします。

f:id:cero-t:20090213003033p:image

動かし終わったら、Stopを押します。


すると、、、ババーン!! キャー! シーケンス図が描画されます。

f:id:cero-t:20090213003032p:image

このシーケンス図はJGraphを使って作成しました。


例に示したのはSAStrutsのサンプルです。

結構やりとりがあるように見えて、

AOPの呼び出しがゴリゴリと動いてるだけだったりするんですけどね。


このツールは、総ライン数が1KL、実ライン数が600L程度の小ささです。

とりあえず動くというレベルですが、BTraceやJGraphのおかげでサクッと作ることが出来ました。

2009-02-09

[]BTraceのClientを叩いてみた。

前回まででBTraceのCompilerを直接叩くことは試したので、

今回は、それで出来あがったクラス(バイト配列)を使って

実際にアプリケーションにアタッチしてみる。


利用するのは、com.sun.btrace.client.Clientクラス。

Client client = new Client(port);
client.attach(pid);
client.submit(clazz, new String[0],
	new CommandListener() {
		@Override
		public void onCommand(Command command) throws IOException {
			System.out.println(command);
		}
	});

portはポート番号(空いてるポートなら何でもいい)で、

pidはアタッチしたい対象のPID、

clazzはBTraceでコンパイルしたクラスのバイト配列である。


これで、イベントが発生するたびにonCommandメソッドが呼ばれる。

接続に成功するとcom.sun.btrace.comm.OkayCommandのインスタンスが渡されるし

メッセージ出力(BTraceUtils#printlnメソッドの呼び出し)が行われると

com.sun.btrace.comm.MessageCommandのインスタンスが渡ってくる、という要領。


「BTraceってコンソールに出力するだけじゃないか、くわっ!」っていう向きの人は

こうやって自前でClientを叩いてみればいい。


こんな感じで、BTraceを思い通りに操作できるようになった。

次は、BTraceを使って出力したログを、可視化するツールの作成だ。

平たく言えば、ArrowVisionを自前で作ろう、ってこと。


JGraphあたりを使おうと思う。