English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua デバッグ(Debug)

Luaは、独自のデバッガーを作成する機能を提供するためにdebugライブラリを提供しています。Lua自体には内蔵のデバッガーはありませんが、多くの開発者が彼らのLuaデバッガーコードを共有しています。

Luaのdebugライブラリには以下の関数が含まれています:

序号メソッド & 用途
1.debug():

ユーザーインタラクションモードに進み、ユーザーが入力する各文字列を実行します。シンプルなコマンドや他のデバッグ設定を使用して、ユーザーはグローバル変数や局所変数を確認し、変数の値を変更し、式を計算するなどができます。
「cont」のみを含む行を入力すると、この関数を終了し、呼び出し元が次に進むことができます。

2.getfenv(object):

オブジェクトの環境変数を返します。

3.gethook(optional thread):

スレッドのフック設定を示す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 の up 番目の上値の名前と値を返します。その関数にその上値がない場合、nil を返します。
'(' (開括号)で始まる変数名は名前のない変数を表します(デバッグ情報を除いたコードブロック)。

10.sethook ([thread,] hook, mask [, count]):

フック関数として関数を設定します。文字列 mask と数字 count がフックがどのタイミングで呼び出されるかを決定します。マスクは以下の文字列で構成されています:各文字に意味があります:

  • 'c': Lua が関数を呼び出すときに、フックを呼び出します;

  • 'r': Lua が関数から戻るときに、フックを呼び出します;

  • 'l': Lua が新しい行に入るときに、フックを呼び出します。

11.setlocal ([thread,] level, local, value):

この関数は value をスタック上の level レベルの関数の第 local 個のローカル変数に割り当てます。その変数がない場合、nil を返します。level が範囲外の場合、エラーを投げます。

12.setmetatable (value, table):

value のメタテーブルを table (nil でも可)に設定します。value を返します。

13.setupvalue (f, up, value):

この関数は value を関数 f の第 up 個の上値に設定します。関数にその上値がない場合、nil を返します。そうでない場合、その上値の名前を返します。

14.traceback ([thread,] [message [, level]]):

message が存在し、それが文字列や nil でない場合、関数は何もしないで直接 message を返します。そうでない場合、呼び出しスタックのスタックトレース情報を返します。オプションの文字列 message は、スタックトレース情報の先頭に追加されます。オプションの数字 level は、スタックのどのレベルからトレースを開始するかを示します(デフォルトは 1 、即ち traceback を呼び出したところ)。

上表に、私たちがよく使用するデバッグ関数が示されています。次に、いくつかの簡単な例を見てみましょう:

function myfunction ()
print(debug.traceback("Stack trace"))
print(debug.getinfo(1))
print("Stack trace end")
        return 10
end

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

この例では、debug 库の traceback と 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があります。 - Debugger、Rldb、ModDebug。

グラフィカルデバッガーには:SciTE、Decoda、ZeroBrane Studio、akdebugger、luaeditがあります。