Latest web development tutorials

루아 디버깅 (디버그)

루아는 우리가 사용자 지정 변환 기능을 만들어 제공하는 디버그 라이브러리를 제공합니다. 루아 자체 내장 총재는 없지만, 많은 개발자들은 총재 루아 코드를 공유 할 수 있습니다.

디버그 라이브러리에 루아는 다음과 같은 기능을 포함한다 :

sethook ([스레드] 후크, 마스크 [카운트]) :
아니오. 방법 및 목적
1. 디버그 () :

사용자가 입력 한 각 문자열을 실행, 사용자가 대화 형 모드를 입력합니다. 간단한 명령 및 다른 디버그 설정을 사용하여, 사용자 등 글로벌 및 로컬 변수를 검토 식의 수를 계산하는 변수의 값을 변경하고있다.
호출자가 아래로 계속 실행할 수 있도록,이 기능이 종료됩니다 만 계속가 포함 된 문자열 입력 라인.

2. getfenv (객체) :

반환 값은 환경 변수를 객체.

3. gethook (선택 사항 나사) :

현재 후크 함수 현재 후크 마스크 및 현재 걸이 횟수 : 반환 세 실 걸이 집합을 의미

4. GetInfo를 ([스레드] F [ 무엇]) :

기능에 대한 정보는 테이블을 리턴합니다. 사용자는 또한, 함수 f의 디지털 표현을 사용하여,이 기능을 제공 할 수있다. 디지털 함수 f는 농도에 대응하는 특정 스레드의 호출 스택에서 실행 나타냄 레벨 0 (자체 된 getInfo) 현재 함수를 나타내고 등 1 층은 그 호 GetInfo를 함수 (이것은 통화 종료가 아닌 경우,이 상황이 스택에 포함되지 않는다)를 나타낸다 . F는 더 많은 수의보다 활동의 수의 함수 인 경우, 반환 nil을 된 getInfo.

5. debug.getlocal ([스레드] F, 로컬) :

이 함수의 이름 및 로컬 로컬 변수의 함수 f 층 스택의 인덱스 값을 리턴한다. 이 기능은 매개 변수, 임시 변수를 포함하여 명시 적으로 정의 된 로컬 변수를 액세스하는 데 사용됩니다.

6. getmetatable (값) :

스택에 테이블 요소의 값으로 지정된 인덱스의 포인트. 인덱스가 유효하지 않거나 위안화의 가치가 더 테이블에없는 경우, 함수는 0을 반환하고 스택에 아무것도 넣지 않습니다.

7. getRegistry의 () :

미리 정의 된 표를 벗어나 위로 레지스트리 테이블하면 루아 값을 저장하려는 C 코드를 저장하는데 사용될 수있다.

8. getupvalue (최대 F)

이 함수는 값의 첫 번째 일까지 F 함수의 이름과 값을 반환합니다. 그것은 그 값을하지 않는 경우 nil을 반환합니다.
에 '('(오픈 괄호) 코드 블록 정보를 디버그를 제외하고 (아무 변수 이름으로 시작하는 변수 이름을 나타냅니다).

10. 후크가로 설정 한 그것은 작동합니다. 문자열 마스크와 디지털 카운트는 훅이 때 호출됩니다 결정합니다. 마스크는 문자열에 다음 문자의 조합, 각 문자는 자신의 의미를 가지고 있습니다 :

  • ' c '루아 함수를 호출 할 때마다 상기 후크 전화;
  • ' r ': 루아가 함수에서 반환 할 때마다이 때 후크라고;
  • ' l ': 루아가 새로운 라인을 입력 할 때마다, 후크를 호출합니다.
11. SETLOCAL ([스레드] 수준, 지역, 값) :

이 함수는 제 로컬 변수 스택 레벨 층 기능에 할당 된 제 1 국부 값이됩니다. 그 변수가없는 경우, 함수는 전무를 반환한다. 국경 간 레벨 경우, 오류가 발생.

12. setmetatable (값 테이블) :

요소 테이블 세트 테이블의 값은 (nil이 될 수 있습니다). 반환 값입니다.

13. setupvalue (F, 최대, 값) :

이 함수는 먼저 함수 f의 값에 값을 설정합니다. 만약 값에 해당 기능을 갖고 있지 않은 경우에는 그 이전 값의 이름을 반환 달리 nil을 반환한다.

14. 역 추적 ([스레드] [메시지 [레벨]]) :

직접 다시 어떤 처리없이 메시지를 메시지, 그리고 문자열 또는 전무, 기능이있는 경우. 그렇지 않으면, 콜 스택 스택 추적 정보를 반환한다. 선택적 메시지 스트링 스택 추적 정보의 시작 부분에 추가된다. 레이어 스택 역 추적하기 시작하는 디지털 옵션 지정 수준 (기본의 위치를 ​​역 추적을 호출하는, 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합니다.