Latest web development tutorials

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

Luaは私たちがカスタムコンバータの機能を作成し提供するためのデバッグ・ライブラリを提供します。 Luaの自体は内蔵の知事はありませんが、多くの開発者が知事Luaのコードを共有しています。

デバッグライブラリでLuaは、以下の機能が含まれています。

sethook([スレッド、]フック、マスク[、カウント]):
いいえ。 方法と目的
1。 デバッグ():

ユーザが入力した各文字列を実行して、ユーザー対話モードを入力します。 単純なコマンドやその他のデバッグ設定を使用して、ユーザは、というように、グローバルとローカル変数を見直し式の数を計算するために変数の値を変更し、することができます。
呼び出し側がダウンして実行を継続できるように、唯一の続きを含む文字列の入力ラインは、この機能を終了します。

2。 getfenv(オブジェクト):

戻り値は、環境変数をオブジェクト。

3。 gethook(オプションスレッド):

現在のフック関数、現在のフックマスク、および現在のフックカウント:戻り値は3スレッドフックセットを表します

4。 getinfo([スレッド、] F [ 、何]):

機能に関する情報は、表を戻します。 あなたはまた、関数fのデジタル表現を使用することができ、この機能を提供することができます。 デジタル関数fはレベルに対応する指定されたスレッドの呼び出しスタック上で実行されている表し:レベル0(それ自体はgetinfo)現在の関数を示し、1層は、コールはgetinfo関数(それが呼び出しの終わりでない限り、このような状況は、スタックに含まれていない)ことを示し、等。 fはnilを返すGETINFO、より多く、より活動の数の関数である場合。

5。 debug.getlocal([スレッド、] F、ローカル):

この関数は、名前とローカルローカル変数の関数f層スタックのインデックスの値を返します。 この関数はパラメータのみ、一時的な変数を含む明示的に定義されたローカル変数にアクセスするために使用されます。

6。 getmetatable(値):

スタックにテーブル要素値に指定されたインデックスポイント。 インデックスが無効であるか、または元の値がないテーブルがない場合、この関数は0を返し、スタックには何もプッシュしていません。

7。 getRegistry():

事前定義された表の外にある戻るレジストリテーブルには、あなたはLuaの値を保存したい任意のCコードを保存するために使用することができます。

8。 getupvalue(アップF)

この関数は、値の最初の1まで関数fの名前と値を返します。 それはその値にない場合は、nilを返します。
'('は、(開き括弧)()コードブロックの情報をデバッグする場合を除き、変数名で始まる変数名を表します。

10。 それはにセットフックとして機能します。 String型のマスクとデジタルカウントはフックがときに呼び出されますを決定します。 マスクは文字列に次の文字の組み合わせである、各文字は、独自の意味があります。

  • c ':Luaが関数を呼び出すたびに、フックを呼び出します。
  • ' r ':Luaが関数から返すたびに、フックと呼ばれています。
  • l ':Luaが新しい行に入るたびに、フックを呼び出します。
11。 SETLOCAL([スレッド、]レベル、ローカル、値):

この関数は、最初のスタックローカル変数レベルのレイヤ機能に割り当てられた最初のローカル値になります。 あなたがその変数を持っていない場合、この関数はnilを返します。 国境を越えたレベルの場合は、エラーをスローします。

12。 setmetatable(値、テーブル):

要素テーブルセットテーブルの値(nilにすることができます)。 戻り値。

13。 setupvalue(F、最大値) :

この関数は、最初の関数fの値に値を設定します。 あなたが値にその機能を持っていない場合、それは前の値の名前を返し、さもなければnilを返します。

14。 トレースバック([スレッド、] [メッセージ [、レベル]]):

あなたが直接戻って任意の処理をせずにメッセージをメッセージではなく、文字列か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に設定してください。 出力の実行が11の代わりに3後に今度は、関数を呼び出します。


デバッグタイプ

  • コマンドラインデバッガ
  • グラフィカルデバッガ

コマンドラインデバッガは、持っている:RemDebug、clidebugger、CTRACE、xdbLua、LuaInterface - デバッガ、Rldb、ModDebug。

グラフィカルインタフェースデバッガは、持っている:SciTEの、Decoda、ZeroBraneスタジオ、akdebugger、luaeditを。