uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Groovyの疑似デバッガgdb

G* Advent Calendarの22日目の@uehajです。

Groovy関係のツール紹介ということで、Groovyの疑似デバッガgdbの紹介。gdbといってもGNUデバッガではありませんよ。

gdbの説明や入手はこちら。これは、一般的なデバッガというより、コード上の特定の場所(com.gdb.GdbShell.gdb()を呼んだところ)で、groovyshが起動するというものです。pyothonには似た機能として「pdb.set_trace()」というのがあるそうですが、それが凄い便利なので真似したとのこと。

gdbの便利ポイントは、コード上の特定位置のコンテキストでshellが起動するため、その時点での変数の値がわかるということです。

たとえば、

int i=3
com.gdb.GdbShell.gdb()
println i

というコードを実行すると、起動したgroovyshではシェル変数としてiを参照することができます*1。加えて、grooysh中では特別な変数「self」で元のコンテキストにおけるthisが参照できます。

gdbは大域AST変換として実装されており、上の場合だと「gdb()」の呼び出し箇所で可視な変数を集めてきてBindingに設定してGroovyshを呼び出します。AST変換のコード例としては、なかなか手頃でおもしろいです。

groovyには、デバッガは、stsとかIntelliJなどIDEのものしか無いので、コマンドライン・エディタ派の人用のものでしょう。

ただしかし、Groovyshにはステップ実行の機能が当然無いため、デバッガとしては現状いまいちです。他に、シェル変数は見れないとか、動的に注入される変数(Grailsのコントローラのparams変数など)は見れないとか、制約もあります。

正直、おもしろそう!と思って調べはじめたものの、実用性としてはまだまだだ、ということがわかってしょぼーんです。でももう時間がないT_Tのでこれで勘弁を。

使用方法は、groovy 1.7, 1.8に応じて

をダウンロードして、groovy単独なら~/.groovy/lib、grailsならproject/libに入れておけば良いでしょう。pomにはなってないので@Grabは使えません。

なお、Grailsは2.0.0で試しましたがエラーになっていました。1.3.7ではうまく動きます。

ではでは。
今年はみなさまおせわになりましたー。よいクリスマスを。

*1:iに値を設定することもできますが元の変数に反映されることはありません