최고의 루아 디버깅 (디버그) 튜토리얼 2024년, 이 튜토리얼에서는 디버깅 유형,를 배울 수 있습니다.
루아는 우리가 사용자 지정 변환 기능을 만들어 제공하는 디버그 라이브러리를 제공합니다. 루아 자체 내장 총재는 없지만, 많은 개발자들은 총재 루아 코드를 공유 할 수 있습니다.
디버그 라이브러리에 루아는 다음과 같은 기능을 포함한다 :
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. | 후크가로 설정 한 그것은 작동합니다. 문자열 마스크와 디지털 카운트는 훅이 때 호출됩니다 결정합니다. 마스크는 문자열에 다음 문자의 조합, 각 문자는 자신의 의미를 가지고 있습니다 :
|
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합니다.