Lua-デバッグ

Luaは、独自のデバッガーを作成するためのすべてのプリミティブ関数を提供するデバッグライブラリを提供します。組み込みのLuaデバッガーはありませんが、さまざまな開発者によって作成されたLua用のデバッガーが多数あり、その多くはオープンソースです。

Luaデバッグライブラリで使用可能な関数を、その使用法とともに次の表に示します。

シニア番号 方法と目的
1

debug()

デバッグのためにインタラクティブモードに入ります。このモードは、1行にcontのみを入力して、Enterキーを押すまでアクティブのままです。ユーザーは、他の関数を使用して、このモード中に変数を検査できます。

2

getfenv(object)

オブジェクトの環境を返します。

3

gethook(optional thread)

スレッドの現在のフック設定を、現在のフック関数、現在のフックマスク、および現在のフックカウントの3つの値として返します。

4

getinfo(optional thread, function or stack level, optional flag)

関数に関する情報を含むテーブルを返します。関数を直接指定することも、関数の値として数値を指定することもできます。これは、指定されたスレッドの呼び出しスタックのレベル関数で実行されている関数を意味します。レベル0が現在の関数(getinfo自体)です。レベル1は、getinfoを呼び出した関数です。等々。関数がアクティブな関数の数よりも大きい場合、getinfoはnilを返します。

5

getlocal(optional thread, stack level, local index)

スタックのレベルで関数のローカルインデックスを持つローカル変数の名前と値を返します。指定されたインデックスを持つローカル変数がない場合はnilを返し、範囲外のレベルで呼び出されるとエラーを発生させます。

6

getmetatable(value)

指定されたオブジェクトのメタテーブルを返します。メタテーブルがない場合はnilを返します。

7

getregistry()

レジストリテーブルを返します。これは、格納する必要のあるLua値を格納するために任意のCコードで使用できる事前定義されたテーブルです。

8

getupvalue(function, upvalue index)

この関数は、関数funcのインデックスアップを使用してupvalueの名前と値を返します。指定されたインデックスにアップバリューがない場合、関数はnilを返します。

9

setfenv(function or thread or userdata, environment table)

指定されたオブジェクトの環境を指定されたテーブルに設定します。オブジェクトを返します。

10

sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count)

指定された関数をフックとして設定します。文字列マスクと数カウントは、フックがいつ呼び出されるかを示します。ここで、c、r、およびlは、Luaが関数のコードのすべての行を呼び出し、返し、入力するたびに呼び出されます。

11

setlocal(optional thread, stack level, local index, value)

スタックのレベルで関数のローカルインデックスを持つローカル変数に値を割り当てます。指定されたインデックスを持つローカル変数がない場合、関数はnilを返し、範囲外のレベルで呼び出されるとエラーを発生させます。それ以外の場合は、ローカル変数の名前を返します。

12

setmetatable(value, metatable)

指定されたオブジェクトのメタテーブルを指定されたテーブル(nilの場合もあります)に設定します。

13

setupvalue(function, upvalue index, value)

この関数は、関数funcのインデックスアップを使用して値をupvalueに割り当てます。指定されたインデックスにアップバリューがない場合、関数はnilを返します。それ以外の場合は、アップバリューの名前を返します。

14

traceback(optional thread, optional message string, optional level argument)

トレースバックを使用して拡張エラーメッセージを作成します。

上記のリストは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関数を使用して出力されます。debug.getinfoは、関数の現在のテーブルを取得します。

デバッグ-例

多くの場合、デバッグのために関数のローカル変数を知る必要があります。そのために、getupvalueを使用し、これらのローカル変数を設定するには、setupvalueを使用します。この簡単な例を以下に示します。

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

この例では、カウンターは呼び出されるたびに1つずつ更新されます。getupvalue関数を使用して、ローカル変数の現在の状態を確認できます。次に、ローカル変数を新しい値に設定します。ここで、集合演算が呼び出される前のnは2です。setupvalue関数を使用すると、10に更新されます。counter関数を呼び出すと、3ではなく11が返されます。

デバッグタイプ

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

コマンドラインデバッグ

コマンドラインデバッグは、コマンドラインを使用してコマンドとprintステートメントを使用してデバッグするタイプのデバッグです。Luaで利用できるコマンドラインデバッガーはたくさんありますが、そのうちのいくつかを以下に示します。

  • RemDebug− RemDebugは、Lua5.0および5.1用のリモートデバッガーです。これにより、別のLuaプログラムの実行をリモートで制御し、ブレークポイントを設定して、プログラムの現在の状態を検査できます。RemDebugは、CGILuaスクリプトをデバッグすることもできます。

  • clidebugger−純粋なLuaで記述されたLua5.1用のシンプルなコマンドラインインターフェイスデバッガー。標準のLua5.1ライブラリ以外には依存していません。RemDebugに触発されましたが、リモート機能はありません。

  • ctrace − LuaAPI呼び出しをトレースするためのツール。

  • xdbLua −Windowsプラットフォーム用のシンプルなLuaコマンドラインデバッガー。

  • LuaInterface - Debugger−このプロジェクトは、LuaInterfaceのデバッガー拡張機能です。組み込みのLuaデバッグインターフェースをより高いレベルに引き上げます。デバッガーとの対話は、イベントとメソッド呼び出しによって行われます。

  • Rldb−これはソケットを介したリモートLuaデバッガーであり、WindowsとLinuxの両方で使用できます。それはあなたに既存のものよりはるかに多くの機能を与えることができます。

  • ModDebug −これにより、別のLuaプログラムの実行をリモートで制御し、ブレークポイントを設定し、プログラムの現在の状態を検査できます。

グラフィカルなデバッグ

グラフィカルなデバッグはIDEの助けを借りて利用でき、変数値、スタックトレース、その他の関連情報などのさまざまな状態の視覚的なデバッグが提供されます。IDEには、ブレークポイント、ステップイン、ステップオーバー、およびその他のボタンを使用して、視覚的な表現と実行の段階的な制御があります。

Luaには多数のグラフィカルデバッガーがあり、次のものが含まれます。

  • SciTE −LuaのデフォルトのWindowsIDEは、ブレークポイント、ステップ、ステップイン、ステップオーバー、変数の監視などの複数のデバッグ機能を提供します。

  • Decoda −これはリモートデバッグをサポートするグラフィカルデバッガです。

  • ZeroBrane Studio−リモートデバッガー、スタックビュー、ウォッチビュー、リモートコンソール、静的アナライザーなどが統合されたLuaIDE。LuaJIT、Love2d、Moai、およびその他のLuaエンジンで動作します。Windows、OSX、およびLinux。オープンソース。

  • akdebugger −Eclipse用のデバッガーおよびエディターのLuaプラグイン。

  • luaedit −これは、リモートデバッグ、ローカルデバッグ、シンタックスハイライト、完了提案リスト、パラメーター提案エンジン、高度なブレークポイント管理(ブレークポイントとヒットカウントの条件システムを含む)、関数リスト、グローバルおよびローカル変数リスト、監視、ソリューション指向の管理を備えています。