Lua 디버깅(디버그)


Lua는 사용자 정의 거버너를 생성하는 기능을 제공하는 디버그 라이브러리를 제공합니다. Lua 자체에는 내장된 거버너가 없지만 많은 개발자가 Lua 거버너 코드를 공유했습니다.

Lua의 디버그 라이브러리에는 다음 기능이 포함되어 있습니다.

sethook([스레드,] 후크, 마스크 [, 개수]):
일련번호방법 및 목적
1.debug():

사용자 상호작용 입력 모드 및 실행 사용자가 입력한 각 문자열입니다. 간단한 명령과 기타 디버깅 설정을 사용하여 사용자는 전역 및 지역 변수를 검사하고, 변수 값을 변경하고, 일부 표현식을 평가하는 등의 작업을 수행할 수 있습니다.
cont만 포함된 줄을 입력하면 기능이 종료되어 발신자가 계속 통화할 수 있습니다.

2.getfenv(object):

객체의 환경 변수를 반환합니다.

3.gethook(선택적 스레드):

스레드 후크 설정을 나타내는 세 가지 값을 반환합니다. 현재 후크 함수, 현재 후크 마스크, 현재 후크 수

4.getinfo([thread,] f [, what]):

함수에 대한 정보 테이블을 반환합니다. 함수를 직접 제공할 수도 있고 숫자 f를 사용하여 함수를 나타낼 수도 있습니다. 숫자 f는 지정된 스레드의 호출 스택의 해당 수준에서 실행되는 함수를 나타냅니다. 수준 0은 현재 함수(getinfo 자체)를 나타냅니다. 수준 1은 getinfo를 호출하는 함수를 나타냅니다. 스택에 포함되지 않습니다.) f가 활성 함수 수보다 큰 숫자인 경우 getinfo는 nil을 반환합니다.

5.debug.getlocal ([thread,] f, local):

이 함수는 stack 레벨 f에 있는 함수의 인덱스는 지역 변수 local의 이름과 값입니다. 이 함수는 명시적으로 정의된 지역 변수에 접근하는 데 사용될 뿐만 아니라 형식 매개변수, 임시 변수 등도 포함합니다.

6.getmetatable(value):

해당 인덱스가 가리키는 값의 메타테이블을 푸시합니다. 스택. 인덱스가 유효하지 않거나 값에 대한 메타테이블이 없으면 함수는 0을 반환하고 아무것도 스택에 푸시하지 않습니다.

7.getregistry():

미리 정의된 테이블인 레지스트리 테이블을 반환하는데 사용할 수 있습니다. C 코드가 저장하려는 Lua 값을 저장합니다.

8.getupvalue(f, up)

이 함수는 함수 f의 상위 값을 반환합니다. 이름과 가치. 함수에 해당 상위 값이 없으면 nil이 반환됩니다.
'('(여는 괄호)로 시작하는 변수 이름은 이름이 없는 변수(디버깅 정보가 제거된 코드 블록)를 나타냅니다.

10. 함수를 후크 함수로 입력하세요. 문자열 마스크와 숫자 개수에 따라 후크가 호출되는 시기가 결정됩니다. 마스크는 다음 문자로 구성되며 각 문자에는 고유한 의미가 있습니다. >


    '
  • ':

    Lua가 함수를 호출할 때마다 후크를 호출하세요.

  • 'r': Lua가 함수에서 돌아올 때마다 후크를 호출하세요.

  • ' l': Lua가 새 줄에 들어갈 때마다 후크가 호출됩니다.

11.setlocal([스레드,] 레벨, 로컬, 값):

스택의 레벨번째 함수의 로컬 변수에 값을 할당하는 함수입니다. 그러한 변수가 없으면 함수는 nil을 반환합니다. 레벨이 범위를 벗어나면 오류가 발생합니다.

12.setmetatable(값, 테이블):

값의 메타테이블을 테이블로 설정(nil일 수 있음) ). 반환 값.

13.setupvalue(f, up, value):

이 함수는 값을 함수 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으로 설정했습니다. 이제 함수를 호출하면 실행 후 출력은 3이 아닌 11이 됩니다.


디버깅 유형

  • 명령줄 디버깅

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

명령줄 디버거에는 RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug가 포함됩니다.

그래픽 분야의 디버거로는 SciTE, Decoda, ZeroBrane Studio, akdebugger 및 luaedit가 있습니다.