fc2ブログ

Decoda:強力なLuaデバッガ(for Windows)

Luaスクリプトのデバッグにはどのような方法を使われていますか?スクリプトでは古きよきprintデバッグもかなり有用ですから、printデバッグで済ましてしまっている方も案外多いかと思います。

とはいえ、スクリプトが想定外の動作をした場合などは、いわゆるデバッガが役に立ちます。特に、グラフィカルなデバッガを使うと生産性はかなり向上するといえます。

しかしLuaのグラフィカルなデバッガには、無料・商用含め、優秀なものがほぼ存在しませんでした。

特にLuaの場合、主な用途が他のアプリへの組み込みということもあって、ダイナミックリンクする場合、スタティックリンクする場合、動作をカスタマイズする場合など、使われ方が様々で、そのどれにも対応可能なデバッガ、そして使いやすいものというのは皆無でした。

そこに登場したのが Decoda (デコーダ)、というわけです。残念ながら無料で試用できるのは30日間で、それ以降使いたい場合はインディーライセンス50ドル、もしくは商用ライセンス200ドル払う必要があります。しかしとりあえず試用してみるだけの価値はあります。

まず、ためしにVisualC++2005とLua5.1で作成していた自作プロジェクトでデバッグをしてみました。

驚くべきことに、Decodaを起動して、プロジェクト設定でexeファイルの場所と作業フォルダを指定して「デバッグ開始」するだけで、ソースコードレベルのデバッグができてしまいました!

アリエナーイ!

こんな感じ↓

decoda_screen2 


 

ブレークポイント、ステップイン、コールスタック、ウォッチの表示など、一通りの機能はほぼ問題なく動作します。使い勝手もVC++に似た感じで、VC++に慣れていればあまり迷うことはないでしょう。

とはいえ、まだ十分熟成されたツールとはいえません。全体的にはまだ荒削りの感はかなりあります。exeの終了とともに落ちることもありますし、Lua側でコルーチンを作りまくっていると反応がなくなったりします。デバッグ開始時にブレークした状態で始まる機能などもほしいところです。

しかしながら、現状でほとんど何の準備もなくLuaスクリプトのデバッグが開始でき、一通りのデバッグ動作ができるというのは、不毛のLuaデバッガの世界にあって十分な魅力です。

スクリプト内の日本語(SJIS)を表示することも可能でした。Tools→Settingからフォントの設定を行い、フォントにMS ゴシックを指定し、また文字セットに「日本語」を指定すると、日本語表示ができます。ただし残念ながらこのあたりの設定は今のところ保存されないようです。いずれ改善されるでしょうね。

なお、print出力をDecodaの出力ペインに出したい場合は、以下のようにすると良いでしょう。
(decodaからデバッグを開始した場合、decoda_outputという出力用の関数が勝手に登録されます)

if not _G.orig_print then
    orig_print = print   -- print退避
    if rawget(_G, "decoda_output") then
        print = function(...)
            local t = {}
            for i,v in ipairs({...}) do
                table.insert(t, tostring(v))
            end
            decoda_output(table.concat(t))
        end
    end
end

なお、デバッグにあたってはpdbファイルを参照していますので、Decodaは基本的にはVC++との組み合わせで使うツールということになるかと思います。

 

さて、上のほうでアリエナーイ!と言ったわけですが、プログラマーとしてどうにも興味深いのが、このデバッグ動作をどうやって実現しているかということです。さきほどデバッグをかけた自作プロジェクトは、Luaコアをスタティックリンクしています。ですから、一般的な感覚として、何か特別に外部とやりとりをするコードを追加しない限り、デバッガがLuaコアとデバッグ用の通信をすることはできません。

たとえばRemDebugというデバッガでは、自作プロジェクトにソケット通信ライブラリを追加し、それを通じて通信を行います。clidedebugというデバッガでは、標準入出力を通じてデバッグができるよう、デバッグ用のLuaスクリプトを読み込ませておきます。

Decodaでは、このようなプロジェクト側の前準備を一切せずにデバッグできてしまいました。Lua部分をDLL化してもいませんから、DLLを「すりかえる」こともできません。つまり一見不可能なことをやっているわけです。

・・・とはいえ、考えてみるとVC++のデバッガは当然のことながらそのレベルの処理を使っているわけで、手法が存在しないわけではないはずです。

Decodaのインストールされたフォルダには LuaInject.dll というファイルが存在します。このファイルを、「インジェクト」するようなのですが、残念ながらこのあたりの機構には詳しくないため、ほとんど想像するしかありません。

フックを利用してターゲットexeのメモリ空間にDLLを読み込み→DLLのメイン関数でLuaの各関数付近のコードを書き換えてDLL内の関数ルーチンを通過するように修正

のような感じでしょうか?この部分は全く自信がありません。ごめんなさい。

 

ついでということでデバッガつながりですが、Luaのメーリングリストで話題になっていたこととして、Scite-debugというデバッガも存在します。SciTEといえばスクリプト系に強いエディターとして最近使用者が増えつつあるように思います。このSciTE上でソースレベルのデバッグをしてしまおう、というものです。

残念ながらScite-debugは、Decodaとは違い、前準備が必要です。SciTEから直接ターゲットプログラムを起動する場合はターゲット側でclidedebugを読み込んでおく必要があり、またリモートデバッグをしたい場合はRemDebugを組み込んでおく必要があります。

残念なことに、少し試してみた限りではうまく起動させることができませんでした。
こちらはもう少し洗練を待つ必要がありそうです。

 

といった感じで、Windows環境限定で、しかも有料ツールになりますが、DecodaがLuaデバッガとしては現状一歩抜けている感じがします。

テーマ:プログラミング - ジャンル:コンピュータ

2008.05.23 | Comments(0) | Trackback(0) | Lua

コメント

コメントの投稿


秘密にする

新しい記事へ <<  | HOME |  >> 古い記事へ

広告:

カテゴリ展開メニュー

  • 未分類(13)
  • Lua(38)
  • プログラミング(11)
  • 食べ物(3)
  • SPAM(2)
  • ゲーム開発(4)
  • GIS/GPS/GoogleMaps(2)
  • スポーツ(1)
  • Skype API(1)
  • AR(1)

はてブ ランキング

ブログ全体: このWikiのはてなブックマーク数

プロフィール

はむ!

Author:はむ!
よく使う言語・環境:
C++,C,Lua,java,VBA,DB
たまにPHPとかjavascript
血液型:O型

メール: lua%ham.nifty.jp
(%を@に変えてください)
ついったー: @hammmm

Lua関連アンテナ

ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する

ブログ内検索