Luaのデバッグ(デバッグ)


Lua は、カスタム ガバナーを作成する機能を提供するデバッグ ライブラリを提供します。 Lua 自体にはガバナーが組み込まれていませんが、多くの開発者が Lua ガバナー コードを共有しています。

Lua のデバッグ ライブラリには次の関数が含まれています:

sethook ([thread,]フック,マスク[, count]): 'l': Lua が新しい関数に入ったとき。ラインに到達するとフックが呼び出されます。 setlocal ([thread,] level, local, value): setmetatable (value, table): setupvalue (f, up, value): traceback ([thread,] [message [, level]]):
シリアル番号方法と目的
1. debug() :

ユーザー対話モードに入り、ユーザーが入力した各文字列を実行します。 簡単なコマンドやその他のデバッグ設定を使用して、ユーザーはグローバル変数とローカル変数を検査したり、変数の値を変更したり、一部の式を評価したりすることができます。
cont のみを含む行を入力すると関数が終了するため、呼び出し側はその行を続行できます。

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. 関数をフック関数として設定します。文字列マスクと数値カウントにより、いつ実行されるかが決まります。フックは呼び出されます。マスクは次の文字で構成される文字列であり、各文字には意味があります:


  • Lua が関数を呼び出すたびに、フックを呼び出します。

  • 'r': r': 每当 Lua 从一个函数内返回时,调用钩子;

  • 'l Lua が関数から戻るたびに、フックを呼び出します。

11.

この関数は、スタック上のレベル 番目の関数のローカルローカル変数に値を代入します。 そのような変数がない場合、関数は nil を返します。 レベルが範囲外の場合、エラーがスローされます。

12.

値のメタテーブルをテーブルに設定します (nil も可)。 戻り値。

13.

この関数は、value を関数 f の上位の値に設定します。 関数がその上限値を持たない場合は nil を返し、それ以外の場合は上限値の名前を返します。

14.

message が存在し、文字列または nil ではない場合、関数は何も処理せずに直接メッセージを返します。 それ以外の場合は、呼び出しスタックのスタック トレースバック情報を返します。 オプションの文字列メッセージがスタック トレースバックの先頭に追加されます。 オプションの数値レベルは、スタックのどのレベルでトレースバックを開始するかを指定します (デフォルトは 1 で、ここでトレースバックが呼び出されます)。

上の表は、一般的に使用されるデバッグ関数のリストです。 次に、いくつかの簡単な例を見てみましょう:

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 になりました。
  • デバッグの種類
  • コマンドラインデバッグ

グラフィカルインターフェースデバッグ

🎜コマンドラインデバッガーには、RemDebug、clidebugger、ctrace、xdbLua、LuaInterface - Debugger、R が含まれます。 ldb、ModDebug。 🎜🎜グラフィックスの世界のデバッガーには、SciTE、Decoda、ZeroBrane Studio、akdebugger、luaedit などがあります。 🎜🎜