YouDebug 1.0 試してみた
川口さんスゴイ!カコイイ!!こんな面白そうなもの試さずにいられるかっ。:-)
→ 非対話的デバッガ YouDebug - 川口耕介のブログ
えーと何でか知りませんが,YouDebug1.0は,Windows XP SP2, JDK1.6.0_15で動かすとスクリプトのロードに失敗して動かせませんでした。
ちなみに,そのときのスタックトレースは以下の通り。
java -jar youdebug-1.0-jar-with-dependencies.jar -socket 5005 debug.ydb Exception in thread "main" java.lang.NullPointerException at java.net.Parts.<init>(URL.java:1262) at java.net.URL.<init>(URL.java:380) at java.net.URL.<init>(URL.java:283) at java.net.URL.<init>(URL.java:306) at groovy.lang.GroovyCodeSource.<init>(GroovyCodeSource.java:83) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77) at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:107) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:52) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:192) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:208) at org.kohsuke.youdebug.VM.execute(VM.groovy:388) at org.kohsuke.youdebug.YouDebug.run(YouDebug.java:113) at org.kohsuke.youdebug.YouDebug.main(YouDebug.java:65
いくつか紆余曲折があったのだけれど,大事なところだけピックアップして残しておくよ。
GitHub(http://github.com/kohsuke/youdebug)から YouDebug-1.0 のソースコード(kohsuke-youdebug-3b5a38e.zipってやつ)を入手。次のように書き換えたところ,上記の不具合は解消した。
-- YouDebug.java -- 113|// vm.execute(script!=null ? new FileInputStream(script) : null); 114| vm.execute(script!=null ? script : null); 115| return 0; 116| }
なんか腑に落ちないが直ったからいいや。:-)
OSXだったら,そんな事しなくても動くんじゃないか?と思って試してみたんだけど,ダメだった。orz
OSXのJDKにはtools.jarが無い事を今さらながら思い出させてくれたわいな(その気になったらパッチあてます。→その気になった)。
→ 2007-09-14 - marsのメモ
ここからはオマケ。GitHubの使い方をわかってないが故の偶然か,一番最初にダウンロードしたYouDebugのコースコードは,"kohsuke-youdebug-eca7f7d.zip"ってやつ。今になって思えば,これは ver1.0 より古いコードなのだと思う。
だけど,こっちのほうがおもろくて(↓)こんな感じのプログラムをデバッグできた。
package com.acme; public class Test { public static void main(String[] args) throws Exception { new Test().run(); } public void run() throws Exception { System.out.println("Started"); while (flag) { Thread.sleep(1000); int i = Math.max(3, 2); int x = i * 2; } throw new IllegalArgumentException("trying an exception breakpoint"); } public static boolean flag = true; public static Object o = new Object() { public int answer(int x) { return 42 + x; } public String toString() { return "custom tostring"; } }; }
なんかワケあってだろう,ver1.0ではこの手のタイプのプログラムにブレイクポイントが仕込めなかった。:-(
たぶん。YouDebugの本領は上記のようなサーバ型プログラムでこそ発揮しそうなので,はやくブレイクポイントし込めるようになると良いなぁとwktkして待つとしよう。
ps.
さて,このYouDebug,どんなところで使おうかと妄想してみたが,こんなんどうかしら?
exceptionBreakpoint()を仕込んでおいて,例外補足したらそん時のコンテキスト情報(ローカル変数とか)を探れるだけ探ってダンプするモニタ。
あんまり節操ないと邪魔になるだけな気もしなくも無し。:-P
でも,あれだ。あたしの記憶が正しければ,JVMTI経由でデバッグ対象にアタッチできるクライアントは1台だけだったと思うし,サーバアプリの場合,テストしているクライアントにJDK/JREが入っている可能性も低いわけで,YouDebugをより楽しく使おう思ったら,何かしらのUIを用意してあげた方がいいのかなぁなんて妄想した。
#HudsonのGroovy Consoleみたいなイメージやね。
教えてエロい人!!
個人的には,JVMTIのエージェント有効にしたまま本番稼働するのはダメなんじゃね?と思っているのだけれど,みなさんどう思います。
OSXでも YouDebug を動かしてみた
や,単に tools.jar 読み込んでる部分を classes.jar に書き直しただけなんだけど(下記の50行あたりを修正)。
-- YouDebug.java -- 47| String home = System.getProperty("java.home"); 48| File toolsJar = new File(new File(home), "../lib/tools.jar"); 49| if (!toolsJar.exists()) { 50| toolsJar = new File(new File(home), "../Classes/classes.jar"); 51| if (!toolsJar.exists()) { 52| System.err.println("This tool requires a JDK, but you are running Java from "+home); 53| System.exit(1); 54| } 55| }
あとMavenにも tools.jar は classes.jar だってことを教えてやんないと mvn package
がコケるので,pom.xmlを下記のように修正しといた。
#なんでか知らんが,はてな記法でxml貼れなかったから,Gistに貼った。
これでおしまい。残念(?)な事に,OSXでも,スクリプト読み込み時のぬるぽが再現したので,上のエントリ同様,YouDebug.javaにパッチをあてた。なんにしろ動いたからいいけど。
そうそう。OSXはSnow Leopard, JDK 1.6.0_15 (32bit) です。