Lua-debugging
Lua-デバッグ
Luaは、独自のデバッガーを作成するためのすべてのプリミティブ関数を提供するデバッグライブラリを提供します。 組み込みのLuaデバッガーはありませんが、多くのオープンソースの開発者によって作成されたLua用のデバッガーが多数あります。
Luaデバッグライブラリで使用可能な関数は、その使用法とともに次の表にリストされています。
Sr.No. | Method & Purpose |
---|---|
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を呼び出した関数です。等々。 functionがアクティブな関数の数よりも大きい場合、getinfoはnilを返します。 |
5 |
getlocal(optional thread, stack level, local index) スタックのレベルで関数のインデックスlocalを持つローカル変数の名前と値を返します。指定されたインデックスを持つローカル変数がない場合はnilを返し、範囲外のレベルで呼び出されるとエラーを発生させます。 |
6 |
getmetatable(value) 指定されたオブジェクトのメタテーブルを返します。メタテーブルがない場合はnilを返します。 |
7 |
getregistry() レジストリテーブルを返します。レジストリテーブルは、Cコードで使用して、保存する必要のあるLua値を保存できる事前定義されたテーブルです。 |
8 |
getupvalue(function, upvalue index) この関数は、関数funcのインデックスupを持つアップバリューの名前と値を返します。 指定されたインデックスにアップバリューがない場合、関数は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) スタックのレベルで関数のインデックスlocalを使用して、値をローカル変数に割り当てます。 この関数は、指定されたインデックスを持つローカル変数が存在しない場合はnilを返し、範囲外のレベルで呼び出されるとエラーを発生させます。 それ以外の場合は、ローカル変数の名前を返します。 |
12 |
setmetatable(value, metatable) 指定されたオブジェクトのメタテーブルを指定されたテーブルに設定します(nilの場合もあります)。 |
13 |
setupvalue(function, upvalue index, value) この関数は、関数funcのインデックスupを使用して値を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が返されます。
デバッグの種類
- コマンドラインデバッグ
- グラフィカルなデバッグ
コマンドラインのデバッグ
コマンドラインデバッグは、コマンドラインとコマンドの出力を使用してデバッグするためにコマンドラインを使用するデバッグの一種です。 Luaで使用できるコマンドラインデバッガは多数ありますが、そのうちのいくつかを以下に示します。
- RemDebug -RemDebugは、Lua 5.0および5.1用のリモートデバッガーです。 別のLuaプログラムの実行をリモートで制御して、ブレークポイントを設定し、プログラムの現在の状態を検査できます。 RemDebugは、CGILuaスクリプトもデバッグできます。
- clidebugger -純粋なLuaで書かれたLua 5.1用のシンプルなコマンドラインインターフェイスデバッガー。 標準のLua 5.1ライブラリ以外には依存していません。 RemDebugに触発されましたが、リモート機能はありません。
- ctrace -Lua API呼び出しをトレースするためのツール。
- xdbLua -Windowsプラットフォーム用のシンプルなLuaコマンドラインデバッガー。
- * LuaInterface-デバッガ*-このプロジェクトは、LuaInterfaceのデバッガ拡張機能です。 組み込みのLuaデバッグインターフェイスをより高いレベルに引き上げます。 デバッガーとの対話は、イベントとメソッド呼び出しによって行われます。
- Rldb -これはソケット経由のリモートLuaデバッガーで、WindowsとLinuxの両方で使用できます。 既存の機能よりもはるかに多くの機能を提供できます。
- ModDebug -これにより、別のLuaプログラムの実行をリモートで制御し、ブレークポイントを設定し、プログラムの現在の状態を検査できます。
グラフィカルなデバッグ
グラフィカルなデバッグは、変数値、スタックトレース、その他の関連情報など、さまざまな状態の視覚的なデバッグを提供するIDEの助けを借りて利用できます。 IDEには、ブレークポイント、ステップイン、ステップオーバー、およびその他のボタンを使用して、視覚的な表現とステップごとの実行制御があります。
Luaには多くのグラフィカルデバッガがあり、次のものが含まれています。
- * SciTE-LuaのデフォルトのWindows IDEは、ブレークポイント、ステップ、ステップイン、ステップオーバー、変数の監視などの複数のデバッグ機能を提供します。
- Decoda -これは、リモートデバッグをサポートするグラフィカルデバッガーです。
- ZeroBrane Studio -リモートデバッガー、スタックビュー、ウォッチビュー、リモートコンソール、静的アナライザーなどが統合されたLua IDE。 LuaJIT、Love2d、Moai、およびその他のLuaエンジンで動作します。 Windows、OSX、およびLinux。 オープンソース。
- akdebugger -Eclipse用のデバッガーおよびエディターLuaプラグイン。
- luaedit -リモートデバッグ、ローカルデバッグ、構文の強調表示、完了提案リスト、パラメーター提案エンジン、高度なブレークポイント管理(ブレークポイントとヒットカウントの条件システムを含む)、関数リスト、グローバルおよびローカル変数リスト、ウォッチ、ソリューション指向管理。