BTrace
JavaOneの時にBTraceのセッションをやっていた人(Sundararajanじゃないけど)に unsafeなことをやりたいって言ったら「自分でやるしかないね」って言われたんだけど それがオフィシャルに出来るようになったらしい。 In "unsafe" mode BTrace permits all J…
BTraceってもうちょっと任意のメソッドを呼べれば良いのになー的に思ってる 数少ないBTraceマニアに向けた裏技。 1. 任意のパッケージにBTraceUtilsっていう名前のクラスを作る。 2. そのクラスに、com.sun.btrace.BTraceUtilsにあるメソッドと同じ名前で、 …
ちなみに、com.sun.btrace.compiler.Compilerも、凝った実装をしているわけではなくて Compiler APIを叩く時に、com.sun.btrace.compiler.Verifierという BTrace独自のソースコードチェックを行っているだけだった。 このVerifierこそが、BTraceの一つの肝で…
せっかくの祝日を活かし、シーケンス図作成ツールを作っちゃいました。 論より証拠、スクリーンキャプチャで見ていきましょう。 起動直後の様子。ただのSwingアプリですね。 ちなみにこの画面はNetBeansのGUIビルダー(Matisse)で作りました。サクサクです…
前回まででBTraceのCompilerを直接叩くことは試したので、 今回は、それで出来あがったクラス(バイト配列)を使って 実際にアプリケーションにアタッチしてみる。 利用するのは、com.sun.btrace.client.Clientクラス。 Client client = new Client(port); c…
突然だけど、BTraceを使って、「対象クラス」を指定するだけで、 典型的なスクリプトを適用できるようなツールを作ってみようと思う。 やり方としては、対象クラスを設定ファイルに書いたうえで スクリプトのテンプレートを用意して、MessageFormatやテンプ…
ということで、叩いてみた。 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,>…
VisualVMのBTracePluginでは、入力された文字列をコンパイルするだけど それをやっているのが、 net.java.btrace.visualvm.compiler.BCompiler#compile(String, String) というメソッド。 これが何をやってるかっていうと、com.sun.btrace.compiler.Compiler…
先月末頃にKnown Issuesが追加され、 .classファイルが壊れる問題がレポートされました。 (中略) この問題さえ解決すれば、SeasarにBTraceを掛けられるようになるでしょうね。 Known Issuesが追加されました。 -- せろ部屋 8月末頃に該当ISSUEが修正されて…
BTraceはJMXに対応したりとか、地道にバージョンアップしている模様。 ちなみに、VisualVMのBTraceプラグインは、 いまだにソースを自分でコンパイルしなきゃいけないみたい。
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…
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 =…
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で解決しようと息巻いて、 sun.instrument.InstrumentationImpl.retransformClasses にBTraceを掛けようとしたのですが、ダメでした。 1. BTrace → Tomcat BTraceにretransformClassesへのフックを追加で書いたのですが タイミングの問…
btraceコマンドのオンデマンドアタッチが悪さして エラーが出てるんじゃないかと推測して、 Tomcatの起動オプションに-javaagentでBTraceを指定して 起動してみたのですが、出てくるエラーは変わらず。
BTraceの実践的な使い方は、作者のblogで紹介されています。 BTrace in the real world -- A. Sundararajan's Weblog これを動かそうとした所、コンパイルエラーが発生して正常動作しませんでした。 以下のような修正を行なったところ、コンパイルエラーがな…
BTraceクラスの実行タイミングを決めるためには、 実行メソッドに @On から始まるアノテーションをつけておきます。 一番使われることが多いのは @OnMethod でしょう。 @OnMethodでは、クラス名、メソッド名を指定できますが、 ユーザーガイドによれば スラ…
HSQLDBのJDBCドライバを使って、簡単なSQLを実行するコードを自前で書いて動かし、 そこに上のJdbcQueries.javaを刺してみた所、問題なく動きました。 とすると、java.sqlに刺すことができないのではなく、 何か特定の実装との相性が良くないみたいですね。
なんだよ、制限多すぎじゃないか、ガッカリだ。 なんて思われるかもしれませんが、というか僕も思いましたが、 それを覆すだけの力を持っているのが、BTraceのライブラリ、BTraceUtilsです。 BTraceUtilsは、唯一BTraceから呼び出す事の出来るライブラリで、…
BTraceは、メソッドのIn/Outや、エラー発生時、あるいは定期実行など いくつかのタイミングで、処理を埋め込む事ができる、とても便利なツールです。 しかも流行りの(しかしググっても全然ヒットしない)オンデマンドアタッチと BCIを使っているので、アプ…
https://btrace.dev.java.net/source/browse/btrace/docs/usersguide.html?rev=1.1.1.1 BTraceのUser's Guideによると、 btraceコマンドは、引数のファイル名の拡張子が「.java」なら その場でコンパイルを行なって、実行してくれるようです。 上のエントリ…
BTrace means best trace -- よねのはてな くっそー! ということで、まずはBTraceを動かせる所までを紹介します。 https://btrace.dev.java.net/ ここからBTraceのバイナリをダウンロードして解凍します。 解凍後、取り回しやすくするために、 binディレク…