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):

스레드 훅 설정을 나타내는 세 가지 값을 반환합니다: 현재 훅 함수, 현재 훅 마스크, 현재 훅 카운트

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
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

이 예제에서는 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

위 예제에서 카운터는 매번 호출될 때마다 자동으로 증가합니다1setupvalue 함수를 사용하여 설정합니다 2현재 함수를 호출하여 실행한 후 출력이됩니다 10。 11 이 대신 3。

디버깅 유형

  • 명령 행 디버깅

  • 그래픽 인터페이스 디버깅

명령 행 디버거는 RemDebug, clidebugger, ctrace, xdbLua, LuaInterface입니다. - Debugger, Rldb, ModDebug.

그래픽 인터페이스 디버거는 SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit입니다.