Luaのデバッグ(デバッグ)
Lua は、カスタム ガバナーを作成する機能を提供するデバッグ ライブラリを提供します。 Lua 自体にはガバナーが組み込まれていませんが、多くの開発者が Lua ガバナー コードを共有しています。
Lua のデバッグ ライブラリには次の関数が含まれています:
sethook ([thread,]フック,マスク[, count]):シリアル番号 | 方法と目的 |
---|---|
1. | debug() : ユーザー対話モードに入り、ユーザーが入力した各文字列を実行します。 簡単なコマンドやその他のデバッグ設定を使用して、ユーザーはグローバル変数とローカル変数を検査したり、変数の値を変更したり、一部の式を評価したりすることができます。 |
2. | getfenv(object): オブジェクトの環境変数を返します。 |
3. | gethook(オプションのスレッド): スレッドフック設定を表す 3 つの値を返します: 現在のフック関数、現在のフックマスク、現在のフック数 |
4. | getinfo ([thread,] f [, what]): 関数に関する情報のテーブルを返します。 関数を直接指定することも、数値 f を使用して関数を表すこともできます。 数値 f は、指定されたスレッドのコール スタックの対応するレベルで実行されている関数を表します。レベル 0 は、現在の関数 (getinfo 自体) を表します。レベル 1 は、getinfo を呼び出す関数を表します (末尾呼び出しでない場合)。スタックにはカウントされません) など。 f がアクティブな関数の数より大きい数値の場合、getinfo は nil を返します。 |
5. | debug.getlocal ([thread,] f, local): この関数は、スタックの f レベルでインデックス local を持つローカル変数の名前と値を返します。 この関数は、明示的に定義されたローカル変数だけでなく、仮パラメータや一時変数などにもアクセスするために使用されます。 |
6. | getmetatable(value): 指定されたインデックスが指す値のメタテーブルをスタックにプッシュします。インデックスが無効な場合、または値のメタテーブルがない場合、関数は 0 を返し、スタックに何もプッシュしません。 |
7. | getregistry(): C コードが保存したい Lua 値を保存するために使用できる事前定義されたテーブルであるレジストリ テーブルを返します。 |
8. | getupvalue (f, up) この関数は、関数 f の上位の値の名前と値を返します。 関数がその上限値を持たない場合は、nil が返されます。 |
10. | 関数をフック関数として設定します。文字列マスクと数値カウントにより、いつ実行されるかが決まります。フックは呼び出されます。マスクは次の文字で構成される文字列であり、各文字には意味があります:
| '
11. | |
この関数は、スタック上のレベル 番目の関数のローカルローカル変数に値を代入します。 そのような変数がない場合、関数は nil を返します。 レベルが範囲外の場合、エラーがスローされます。 | 12. |
値のメタテーブルをテーブルに設定します (nil も可)。 戻り値。 | 13. |
この関数は、value を関数 f の上位の値に設定します。 関数がその上限値を持たない場合は nil を返し、それ以外の場合は上限値の名前を返します。 | 14. |
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上記の例では、デバッグ関数を使用しました。ライブラリ トレースバック関数と getinfo 関数。getinfo 関数は、関数情報のテーブルを返すために使用されます。 別の例 関数内のローカル変数をデバッグする必要がよくあります。 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
- 上記の例では、呼び出されるたびにカウンターが 1 ずつ増加します。この例では、getupvalue 関数を使用してローカル変数の現在のステータスを表示します。ローカル変数を新しい値に設定できます。この例では、設定前の n の値が 2 で、setupvalue 関数を使用して 10 に設定されています。ここで関数を呼び出したところ、実行後の出力は 3 ではなく 11 になりました。
- デバッグの種類
- コマンドラインデバッグ