1

luaデバッグライブラリを使用して、変数の値がいつ変更されたかを検出することは可能ですか?値が変更された関数や以前の値などの詳細を提供するコールバック関数のようなもの。そのようなことは可能ですか?

フックについて読みましたが、フックを変数に設定できるかどうかわかりません。

4

2 に答える 2

2

Luaでは、メタテーブルを使用して「プロキシ」テーブルを保持し、__ newindex関数呼び出しを使用して変数を追加する試みを検出することで、これをある程度行うことができます。

これについては、「Luaでのプログラミング」の本の「テーブルアクセスの追跡」セクションで説明されています。

http://www.lua.org/pil/13.4.4.html

関連項目
http://www.gammon.com.au/forum/?id=10887

于 2012-08-13T20:43:14.177 に答える
2

デバッガーを使用してもかまわない場合は、一部のデバッガーで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")
  1. mobdebug.luaをダウンロードして、スクリプトで利用できるようにします(最も簡単な方法は、スクリプトを含むフォルダーに配置することです)。
  2. コマンドを使用してサーバーを起動しますlua -e "require('mobdebug').listen()"
  3. コマンドを使用してクライアントを起動しますlua -e "require('mobdebug').loop()"
  4. サーバーウィンドウにプロンプ​​トが表示されます:'>'。スクリプトload start.luaをロードするために入力します。
  5. 入力stepしてからstepもう一度入力します。「ファイルstart.luaの3行目で一時停止」と表示されます。
  6. の値を見てみましょうfoo。入力eval fooすると、0が表示されます。
  7. これで、時計をセットアップできます。タイプsetw foo == 2。setwコマンドの後に任意のLua式を指定できます。条件がtrueと評価されると、スクリプトの実行は停止します。
  8. 「run」コマンドを使用してスクリプトの実行を続行します。
  9. ウォッチが起動し、「ファイルstart.luaの8行目で一時停止しました(ウォッチ式1:[foo == 2])」のようなメッセージが表示されます。これは、前の式が値fooを2に変更し、実行が8行目で停止することを意味します。次に、スクリプトと現在の値を検査できます(「eval」および「exec」コマンドを使用して、任意のLuaコードを実行できます。スクリプト環境で評価)、変更のトリガーとなったものを見つけます。

このアプローチの利点は、テーブル値の監視に限定されず、任意の式を指定できることです。主な欠点は、スクリプトがデバッガーの下で実行され、式が各ステップの後に評価されることです。これは非常に遅くなる可能性があります。

于 2012-08-13T21:50:23.600 に答える