luaデバッグライブラリを使用して、変数の値がいつ変更されたかを検出することは可能ですか?値が変更された関数や以前の値などの詳細を提供するコールバック関数のようなもの。そのようなことは可能ですか?
フックについて読みましたが、フックを変数に設定できるかどうかわかりません。
Luaでは、メタテーブルを使用して「プロキシ」テーブルを保持し、__ newindex関数呼び出しを使用して変数を追加する試みを検出することで、これをある程度行うことができます。
これについては、「Luaでのプログラミング」の本の「テーブルアクセスの追跡」セクションで説明されています。
デバッガーを使用してもかまわない場合は、一部のデバッガーでWatch式を設定できます。これは、式の条件がtrueの場合にトリガーされます。MobDebugでこれを行う方法を示します(luaデバッグライブラリを使用していますが、私が知る限り、変数の変更を直接検出する方法はありません)。
次のようなスクリプトがあり、値2を取得start.lua
する場所を検出するとします。foo
print("Start")
local foo = 0
for i = 1, 3 do
local function bar()
print("In bar")
end
foo = i
print("Loop")
bar()
end
print("End")
lua -e "require('mobdebug').listen()"
。lua -e "require('mobdebug').loop()"
。load start.lua
をロードするために入力します。step
してからstep
もう一度入力します。「ファイルstart.luaの3行目で一時停止」と表示されます。foo
。入力eval foo
すると、0が表示されます。setw foo == 2
。setwコマンドの後に任意のLua式を指定できます。条件がtrueと評価されると、スクリプトの実行は停止します。foo
を2に変更し、実行が8行目で停止することを意味します。次に、スクリプトと現在の値を検査できます(「eval」および「exec」コマンドを使用して、任意のLuaコードを実行できます。スクリプト環境で評価)、変更のトリガーとなったものを見つけます。このアプローチの利点は、テーブル値の監視に限定されず、任意の式を指定できることです。主な欠点は、スクリプトがデバッガーの下で実行され、式が各ステップの後に評価されることです。これは非常に遅くなる可能性があります。