1. ホーム
  2. スクリプト・コラム
  3. ルア

Luaのビルトインデバッガの使い方解説

2022-02-10 15:44:29

 Luaにはデバッグ用のライブラリが用意されており、独自のデバッガを作成するための基本的な機能はすべて備わっています。それでも、Luaのデバッガはビルトインされておらず、Luaはオープンソースで開発者向けに多くのデバッガを作成しています。

デバッグ用Luaライブラリで利用できる機能を、用途とともに下表に示します。

 上記のリストは、私たちが頻繁に使用するLuaデバッグ関数の完全なリストであり、上記の関数を使用し、より便利なデバッグライブラリを提供します。これらの関数を使用して、独自のデバッガを作成することは非常に複雑であり、最良の選択肢とは言えません。いずれにせよ、簡単なデバッグ関数を使用する例を見ていきます。

コピーコード コードは以下の通りです。
function myfunction ()
print(debug.traceback("Stack trace"))
print(debug.getinfo(1))
print("Stack trace end")
 return 10
end
myfunction ()
print(debug.getinfo(1))

上記のプログラムを実行すると、以下のようなスタックトレース情報が得られます。

コピーコード コードは以下の通りです。
Stack trace
stack traceback:
 test2.lua:2: in function 'myfunction'
 test2.lua:8: in main chunk
 [C]: ?
table: 0054C6C8
Stack trace end

上記のサンプルプログラムでは、デバッグライブラリにある debug.trace 関数を使用してスタックトレースを表示しています。
別の例

デバッグのために、ある関数のローカル変数を知っておく必要があることがよくあります。このような場合、setupvalue を使ってローカル変数を設定し、getupvalue を使ってローカル変数を取得することができます。以下に、その簡単な例を示します。

コピーコード コードは以下の通りです。
function newCounter ()
  local n = 0
  local k = 0
  return function ()
    k = n
    n = n + 1
    return n
    end
end

counter = newCounter ()
print(counter())
print(counter())

local i = 1

repeat
  name, val = debug.getupvalue(counter, i)
  if name then
    print ("index", i, name, "=", val)
 if(name == "n") then
  debug.setupvalue (counter,2,10)
 end
    i = i + 1
  end -- if
until not name

print(counter())

上記のプログラムを実行すると、次のような出力が得られます。

コピーコード コードは以下の通りです。
1
2
index 1 k = 1
index 2 n = 2
11

この例では、呼び出されたときに毎回カウンターを更新しています。getupvalue関数を使って、ローカル変数の現在の状態を取得することができます。そして、そのローカル変数に新しい値を設定します。ここでは、演算が呼び出される前に n が 2 に設定されています。setupvalue関数を使って10に更新すると、カウンター関数が呼ばれたとき、3ではなく11が返されます。
デバッグタイプ

  •     コマンドラインデバッグ
  •     グラフィカルなデバッグ

コマンドラインデバッギング

コマンドラインデバッグとは、コマンドラインを使って、コマンドやprint文でデバッグを行うものです。以下にいくつか紹介しますが、Luaでは多くのコマンドライン・デバッガが利用可能です。

  •     RemDebug。RemDebugはLua 5.0と5.1のリモートデバッガです。他のLuaプログラムの実行をリモートで制御し、ブレークポイントを設定したり、プログラムの現在の状態を確認したりすることができます。また、RemDebugはCGILuaスクリプトのデバッグも可能です。
  •     clidebugger: 純粋なLuaで書かれたlua5.1用のシンプルなコマンドラインインターフェイスデバッガです。Lua5.1標準のライブラリ以外には依存していません。RemDebugにインスパイアされていますが、リモートデバイスは持っていません。
  •     ctrace LuaのAPIコールをトレースするツール。
  •     xdbLua。Windowsプラットフォーム用のシンプルなLuaコマンドラインデバッガです。
  •     LuaInterface - デバッガ。このプロジェクトは、LuaInterfaceデバッガーを拡張したものです。Lua上に構築されたLuaデバッギング・インタフェースをより高い次元で実現します。デバッガとのインタラクションは、イベントとメソッドコールによって行われます。
  •     Rldb: WindowsとLinux用のソケットを使ったリモートLUAデバッガです。既存のどのデバッガよりも多くの機能を提供することができます。
  •     ModDebug。他のLuaプログラムの実行をリモートで制御し、ブレークポイントを設定したり、現在のプログラムの状態を確認することが可能になります。

グラフィカルデバッギング

グラフィカルデバッグは、IDEが変数の値やスタックトレース情報などの様々な関連情報を提供し、視覚的なデバッグを提供します。IDEのブレークポイント、次のステップの制御、ステップイン、スキップ、その他のボタンを使用して実行されるステップの視覚的な表現があります。

グラフィカルなLuaデバッガは多数あり、以下のようなものがあります。

  •     SciTE:デフォルトのWindows IDEにおけるLuaは、ブレークポイント、ステップ、ステップイン、スキップ、ビュー変数など、様々なデバッグツールを提供します。
  •     Decoda リモートデバッグをサポートするグラフィカルなデバッガーです。
  •     ZeroBrane Studio。リモートデバッガ、スタックビュー、テーブルビュー、リモートコンソール、スタティックアナライザなどが統合されたLuaのIDE。LuaJIT、Love2d、Moai、その他のLuaエンジンで動作します。Windows、OSX、Linuxで利用可能で、オープンソースです。
  •     akdebugger: LuaのためのEclipseプラグイン - デバッガとエディタ。
  •     luaedit: リモートデバッグ、ローカルデバッグ、シンタックスハイライト、オートコンプリート提案リスト、パラメータ提案エンジン、事前ブレークポイント管理(ブレークポイントACシステムとヒットカウントを含む)、関数リスト、グローバルおよびローカル変数リスト、ビュー、問題解決重視の管理機能