谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

BTrace

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

JavaOneの時にBTraceのセッションをやっていた人(Sundararajanじゃないけど)に unsafeなことをやりたいって言ったら「自分でやるしかないね」って言われたんだけど それがオフィシャルに出来るようになったらしい。 In "unsafe" mode BTrace permits all J…

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

BTraceってもうちょっと任意のメソッドを呼べれば良いのになー的に思ってる 数少ないBTraceマニアに向けた裏技。 1. 任意のパッケージにBTraceUtilsっていう名前のクラスを作る。 2. そのクラスに、com.sun.btrace.BTraceUtilsにあるメソッドと同じ名前で、 …

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

ちなみに、com.sun.btrace.compiler.Compilerも、凝った実装をしているわけではなくて Compiler APIを叩く時に、com.sun.btrace.compiler.Verifierという BTrace独自のソースコードチェックを行っているだけだった。 このVerifierこそが、BTraceの一つの肝で…

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

せっかくの祝日を活かし、シーケンス図作成ツールを作っちゃいました。 論より証拠、スクリーンキャプチャで見ていきましょう。 起動直後の様子。ただのSwingアプリですね。 ちなみにこの画面はNetBeansのGUIビルダー(Matisse)で作りました。サクサクです…

BTraceのClientを叩いてみた。

前回まででBTraceのCompilerを直接叩くことは試したので、 今回は、それで出来あがったクラス(バイト配列)を使って 実際にアプリケーションにアタッチしてみる。 利用するのは、com.sun.btrace.client.Clientクラス。 Client client = new Client(port); c…

BTraceを作った簡単なツールを作ってみるか

突然だけど、BTraceを使って、「対象クラス」を指定するだけで、 典型的なスクリプトを適用できるようなツールを作ってみようと思う。 やり方としては、対象クラスを設定ファイルに書いたうえで スクリプトのテンプレートを用意して、MessageFormatやテンプ…

BTraceのCompilerを直接叩いてみた。

ということで、叩いてみた。 com.sun.btrace.compiler.Compiler compiler = new Compiler(); Map<String, byte[]> classMap = compiler.compile("Trace.java", source, new OutputStreamWriter(System.err), null, null); System.out.println(classMap.get("Trace").length);</string,>…

BTraceのコンパイラは何をやっているのか?

VisualVMのBTracePluginでは、入力された文字列をコンパイルするだけど それをやっているのが、 net.java.btrace.visualvm.compiler.BCompiler#compile(String, String) というメソッド。 これが何をやってるかっていうと、com.sun.btrace.compiler.Compiler…

SAStrutsに問題なくBTraceが刺さりました。

先月末頃にKnown Issuesが追加され、 .classファイルが壊れる問題がレポートされました。 (中略) この問題さえ解決すれば、SeasarにBTraceを掛けられるようになるでしょうね。 Known Issuesが追加されました。 -- せろ部屋 8月末頃に該当ISSUEが修正されて…

地道にバージョンアップを重ねているらしい

BTraceはJMXに対応したりとか、地道にバージョンアップしている模様。 ちなみに、VisualVMのBTraceプラグインは、 いまだにソースを自分でコンパイルしなきゃいけないみたい。

Known Issuesが追加されました。

https://btrace.dev.java.net/ 先月末頃にKnown Issuesが追加され、 .classファイルが壊れる問題がレポートされました。 ところで、BTraceクラスをちょっと修正すると、問題が出なくなりました。 import static com.sun.btrace.BTraceUtils.*; import com.su…

問題を絞り込めてきました。

やっぱり、SAStrutsにBTraceが刺さらない問題の原因は HSQLDB云々ではなく、BTraceが生成するクラスのようです。 Listのaddをフックしてみるシンプルなスクリプトを書きました。 import static com.sun.btrace.BTraceUtils.*; import com.sun.btrace.*; impo…

dumpしたクラスファイルをClassLoadしてみた。

btraceのdumpオプションを有効にして出力した.classファイルを Javaでクラスロードしてみました。 import java.io.File; import java.io.FileInputStream; public class LoadClass { public static void main(String[] args) throws Exception { File file =…

dumpされたクラスにjavapしてみた。

dumpClassesオプションをtrueにして SAStrutsのサンプルにBTraceを掛けると Tomcatのbinに「org\hsqldb\jdbc」ディレクトリが出来て、 その中に「jdbcConnection.class」が出来上がります。 早速、このクラスに対してjavapを掛けてみると java.io.EOFExcepti…

デバッグオプションがありました。

仕方ないのでBTraceのソースをCVSから取ってきてチョコチョコ見てたら debugオプションがありました。 btrace.batを見ると、以下のようなオプション指定が見つかります。 -Dcom.sun.btrace.dumpClasses=false -Dcom.sun.btrace.debug=falsedumpClassesオプシ…

BTraceの問題解決のためにBTraceを使おうとして撃沈。

BTraceの問題をBTraceで解決しようと息巻いて、 sun.instrument.InstrumentationImpl.retransformClasses にBTraceを掛けようとしたのですが、ダメでした。 1. BTrace → Tomcat BTraceにretransformClassesへのフックを追加で書いたのですが タイミングの問…

SAStrutsのサンプルにBTraceが刺さらない問題は、javaagent指定でも無理。

btraceコマンドのオンデマンドアタッチが悪さして エラーが出てるんじゃないかと推測して、 Tomcatの起動オプションに-javaagentでBTraceを指定して 起動してみたのですが、出てくるエラーは変わらず。

なんか問題が発生し始めました。

BTraceの実践的な使い方は、作者のblogで紹介されています。 BTrace in the real world -- A. Sundararajan's Weblog これを動かそうとした所、コンパイルエラーが発生して正常動作しませんでした。 以下のような修正を行なったところ、コンパイルエラーがな…

@OnMethodは正規表現が使え、アノテーションも対象にできる

BTraceクラスの実行タイミングを決めるためには、 実行メソッドに @On から始まるアノテーションをつけておきます。 一番使われることが多いのは @OnMethod でしょう。 @OnMethodでは、クラス名、メソッド名を指定できますが、 ユーザーガイドによれば スラ…

なんか問題が発生し始めました。(cont'd)

HSQLDBのJDBCドライバを使って、簡単なSQLを実行するコードを自前で書いて動かし、 そこに上のJdbcQueries.javaを刺してみた所、問題なく動きました。 とすると、java.sqlに刺すことができないのではなく、 何か特定の実装との相性が良くないみたいですね。

キモはBTraceUtils

なんだよ、制限多すぎじゃないか、ガッカリだ。 なんて思われるかもしれませんが、というか僕も思いましたが、 それを覆すだけの力を持っているのが、BTraceのライブラリ、BTraceUtilsです。 BTraceUtilsは、唯一BTraceから呼び出す事の出来るライブラリで、…

BTraceの制限事項

BTraceは、メソッドのIn/Outや、エラー発生時、あるいは定期実行など いくつかのタイミングで、処理を埋め込む事ができる、とても便利なツールです。 しかも流行りの(しかしググっても全然ヒットしない)オンデマンドアタッチと BCIを使っているので、アプ…

btracecコマンド

https://btrace.dev.java.net/source/browse/btrace/docs/usersguide.html?rev=1.1.1.1 BTraceのUser's Guideによると、 btraceコマンドは、引数のファイル名の拡張子が「.java」なら その場でコンパイルを行なって、実行してくれるようです。 上のエントリ…

はじめようBTrace

BTrace means best trace -- よねのはてな くっそー! ということで、まずはBTraceを動かせる所までを紹介します。 https://btrace.dev.java.net/ ここからBTraceのバイナリをダウンロードして解凍します。 解凍後、取り回しやすくするために、 binディレク…