Lua-디버깅
Lua는 자체 디버거를 생성 할 수있는 모든 기본 함수를 제공하는 디버그 라이브러리를 제공합니다. 내장 된 Lua 디버거는 없지만 많은 개발자가 오픈 소스로 만든 Lua 용 디버거가 많습니다.
Lua 디버그 라이브러리에서 사용할 수있는 기능은 용도와 함께 다음 표에 나열되어 있습니다.
Sr. 아니. | 방법 및 목적 |
---|---|
1 | debug() 한 줄에 cont 만 입력하고 Enter 키를 누를 때까지 활성화 된 디버깅을위한 대화 형 모드로 들어갑니다. 사용자는이 모드에서 다른 기능을 사용하여 변수를 검사 할 수 있습니다. |
2 | getfenv(object) 개체의 환경을 반환합니다. |
삼 | gethook(optional thread) 스레드의 현재 후크 설정을 현재 후크 함수, 현재 후크 마스크 및 현재 후크 수의 세 가지 값으로 반환합니다. |
4 | getinfo(optional thread, function or stack level, optional flag) 함수에 대한 정보가있는 테이블을 반환합니다. 함수를 직접 줄 수도 있고, 함수 값으로 숫자를 줄 수도 있는데, 이는 주어진 스레드의 호출 스택의 수준 함수에서 실행되는 함수를 의미합니다. 수준 0은 현재 함수 (getinfo 자체)입니다. 레벨 1은 getinfo를 호출 한 함수입니다. 등등. function이 활성 함수의 수보다 큰 수이면 getinfo는 nil을 반환합니다. |
5 | getlocal(optional thread, stack level, local index) 스택의 레벨에서 함수의 로컬 인덱스가있는 로컬 변수의 이름과 값을 반환합니다. 지정된 인덱스의 로컬 변수가없는 경우 nil을 반환하고 범위를 벗어난 레벨로 호출하면 오류를 발생시킵니다. |
6 | getmetatable(value) 주어진 객체의 메타 테이블을 반환하거나 메타 테이블이없는 경우 nil을 반환합니다. |
7 | getregistry() 저장해야하는 Lua 값을 저장하기 위해 C 코드에서 사용할 수있는 미리 정의 된 테이블 인 레지스트리 테이블을 반환합니다. |
8 | getupvalue(function, upvalue index) 이 함수는 함수 func의 색인이 위로 올라간 값의 이름과 값을 반환합니다. 주어진 인덱스에 upvalue가 없으면 함수는 nil을 반환합니다. |
9 | setfenv(function or thread or userdata, environment table) 주어진 테이블에 주어진 개체의 환경을 설정합니다. 개체를 반환합니다. |
10 | sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count) 주어진 함수를 후크로 설정합니다. 문자열 마스크와 숫자 개수는 후크가 호출되는시기를 설명합니다. 여기서, c, r 및 l은 Lua가 함수의 모든 코드 행을 각각 호출하고, 반환하고, 입력 할 때마다 호출됩니다. |
11 | setlocal(optional thread, stack level, local index, value) 스택 수준에서 함수의 로컬 인덱스를 사용하여 값을 로컬 변수에 할당합니다. 이 함수는 주어진 인덱스를 가진 지역 변수가 없으면 nil을 반환하고 범위를 벗어난 수준으로 호출하면 오류를 발생시킵니다. 그렇지 않으면 지역 변수의 이름을 반환합니다. |
12 | setmetatable(value, metatable) 주어진 객체에 대한 메타 테이블을 주어진 테이블 (nil 일 수 있음)로 설정합니다. |
13 | setupvalue(function, upvalue index, value) 이 함수는 함수 func의 인덱스가 위로 올라간 값에 값을 할당합니다. 주어진 인덱스에 upvalue가 없으면 함수는 nil을 반환합니다. 그렇지 않으면 upvalue의 이름을 반환합니다. |
14 | traceback(optional thread, optional message string, optional level argument) 역 추적을 사용하여 확장 오류 메시지를 작성합니다. |
위 목록은 Lua의 전체 디버그 기능 목록이며 위의 기능을 사용하고 더 쉬운 디버깅을 제공하는 라이브러리를 자주 사용합니다. 이러한 함수를 사용하고 자체 디버거를 만드는 것은 매우 복잡하고 바람직하지 않습니다. 어쨌든 디버깅 기능의 간단한 사용 예를 살펴 보겠습니다.
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.trace 함수를 사용하여 인쇄됩니다. debug.getinfo는 함수의 현재 테이블을 가져옵니다.
디버깅-예
우리는 종종 디버깅을 위해 함수의 지역 변수를 알아야합니다. 이를 위해 getupvalue를 사용하고 이러한 지역 변수를 설정하기 위해 setupvalue를 사용할 수 있습니다. 이에 대한 간단한 예가 아래에 나와 있습니다.
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
이 예에서 카운터는 호출 될 때마다 하나씩 업데이트됩니다. getupvalue 함수를 사용하여 지역 변수의 현재 상태를 볼 수 있습니다. 그런 다음 지역 변수를 새 값으로 설정합니다. 여기서 n은 set 연산이 호출되기 전에 2입니다. setupvalue 함수를 사용하면 10으로 업데이트됩니다. 이제 counter 함수를 호출하면 3 대신 11을 반환합니다.
디버깅 유형
- 명령 줄 디버깅
- 그래픽 디버깅
명령 줄 디버깅
명령 줄 디버깅은 명령 줄을 사용하여 명령 및 인쇄 문을 사용하여 디버깅하는 디버깅 유형입니다. Lua에 사용할 수있는 많은 명령 줄 디버거가 있으며 그중 몇 가지는 아래에 나열되어 있습니다.
RemDebug− RemDebug는 Lua 5.0 및 5.1 용 원격 디버거입니다. 다른 Lua 프로그램의 실행을 원격으로 제어하고 중단 점을 설정하고 프로그램의 현재 상태를 검사 할 수 있습니다. RemDebug는 CGILua 스크립트도 디버깅 할 수 있습니다.
clidebugger− 순수한 Lua로 작성된 Lua 5.1 용 간단한 명령 줄 인터페이스 디버거. 표준 Lua 5.1 라이브러리 이외의 다른 것에 의존하지 않습니다. RemDebug에서 영감을 얻었지만 원격 시설이 없습니다.
ctrace − Lua API 호출을 추적하기위한 도구.
xdbLua − Windows 플랫폼 용 간단한 Lua 명령 줄 디버거.
LuaInterface - Debugger−이 프로젝트는 LuaInterface 용 디버거 확장입니다. 내장 된 Lua 디버그 인터페이스를 더 높은 수준으로 올립니다. 디버거와의 상호 작용은 이벤트 및 메서드 호출에 의해 수행됩니다.
Rldb− 이것은 소켓을 통한 원격 Lua 디버거이며 Windows와 Linux에서 모두 사용할 수 있습니다. 기존 기능보다 훨씬 더 많은 기능을 제공 할 수 있습니다.
ModDebug −이를 통해 다른 Lua 프로그램의 실행을 원격으로 제어하고, 중단 점을 설정하고, 프로그램의 현재 상태를 검사 할 수 있습니다.
그래픽 디버깅
변수 값, 스택 추적 및 기타 관련 정보와 같은 다양한 상태의 시각적 디버깅이 제공되는 IDE의 도움으로 그래픽 디버깅을 사용할 수 있습니다. IDE의 중단 점, 스텝 인, 스텝 오버 및 기타 버튼을 사용하여 시각적 표현과 단계별 실행 제어가 있습니다.
Lua를위한 많은 그래픽 디버거가 있으며 다음을 포함합니다.
SciTE − Lua 용 기본 Windows IDE는 중단 점, 스텝, 스텝 인, 스텝 오버, 변수 감시 등과 같은 여러 디버깅 기능을 제공합니다.
Decoda − 원격 디버깅을 지원하는 그래픽 디버거입니다.
ZeroBrane Studio− 원격 디버거, 스택보기, 감시보기, 원격 콘솔, 정적 분석기 등이 통합 된 Lua IDE. LuaJIT, Love2d, Moai 및 기타 Lua 엔진과 함께 작동합니다. Windows, OSX 및 Linux. 오픈 소스.
akdebugger − Eclipse 용 디버거 및 편집기 Lua 플러그인.
luaedit − 원격 디버깅, 로컬 디버깅, 구문 강조, 완성 제안 목록, 매개 변수 제안 엔진, 고급 중단 점 관리 (중단 점 및 적중 횟수에 대한 조건 시스템 포함), 함수 목록, 전역 및 지역 변수 목록, 감시, 솔루션 지향 관리 기능이 있습니다.