2012-08-13 3 views
1

lua 디버그 라이브러리를 사용하여 변수 값이 변경된 경우이를 감지 할 수 있습니까? 값이 변경된 함수, 이전 값 등의 세부 정보를 제공하는 콜백 함수와 같은 것 그런 것이 가능합니까?루아 디버깅 - 변수 값 변경시 감지

후크에 대해 읽었지만 후크를 변수로 설정할 수 있는지 확실하지 않습니다.

+1

관심있는 개체에 대한 메타 테이블에 사용자 지정 설정 메서드를 추가 할 수 있습니다. 실행시 경고하도록합니다. – TheZ

답변

2

사용 괜찮다면 디버거를 사용하면 일부 디버거에서 표현식의 조건이 참일 때 실행되는 조사 식을 설정할 수 있습니다. 이것을 MobDebug에서 어떻게 수행 할 수 있는지 보여줄 것입니다. (lua 디버그 라이브러리를 사용하고 있지만, 내가 아는 한 변수 변경을 감지하는 직접적인 방법은 없습니다).

print("Start") 
local foo = 0 
for i = 1, 3 do 
    local function bar() 
    print("In bar") 
    end 
    foo = i 
    print("Loop") 
    bar() 
end 
print("End") 
  1. 다운로드 mobdebug.lua 및 스크립트 (가장 간단한 방법은 배치하는 것입니다에서 사용할 수 있도록 :

    하자 우리는 아래와 같은 스크립트 start.lua을 가지고 foo 값 2를 얻을 곳 감지하고 싶은 말은 귀하의 스크립트와 함께 폴더에).

  2. lua -e "require('mobdebug').listen()" 명령을 사용하여 서버를 시작하십시오.
  3. lua -e "require('mobdebug').loop()" 명령을 사용하여 클라이언트를 시작하십시오.
  4. 서버 창에 '>'프롬프트가 나타납니다. 스크립트를로드하려면 load start.lua을 입력하십시오.
  5. 유형 step 다음으로 step입니다. "파일 시작시 일시 중지되었습니다 .lua line 3"이 표시됩니다.
  6. foo 값이 무엇인지 보자. eval foo을 입력하면 0이 표시됩니다.
  7. 이제 시계를 설정할 수 있습니다. 유형 : setw foo == 2. setw 명령 다음에 Lua 표현식을 지정할 수 있습니다. 조건이 참으로 평가되면 스크립트의 실행이 중지됩니다.
  8. "run"명령을 사용하여 스크립트를 계속 실행하십시오.
  9. 시계가 작동하면서 "파일 시작시 잠시 멈췄습니다. 8 번 (시계 식 1 : [foo == 2])"과 같은 메시지가 표시됩니다. 이는 이전 표현식이 foo의 값을 2로 변경했으며 실행이 8 행에서 중지되었음을 의미합니다. 그런 다음 스크립트와 현재 값을 검사 할 수 있습니다 ("eval"및 "exec"명령을 사용하여 Lua 코드를 실행할 수 있음). 스크립트 환경에서 평가)를 사용하여 변경 사항을 트리거 한 원인을 찾으십시오.

이 접근법의 이점은 테이블 값을 모니터링하는 것으로 국한되지 않고 모든 표현식을 지정할 수 있다는 것입니다. 가장 큰 단점은 스크립트가 디버거에서 실행되고 각 단계마다 표현식이 평가되므로 속도가 느려질 수 있다는 점입니다.

+0

매우 편리합니다. 나는이 깔끔한 라이브러리를 가지고 어지러운 행동을 할 것입니다 .. 감사합니다. 제비! – SatheeshJM

2

메타 테이블을 사용하고 "프록시"테이블을 유지하고 __newindex 함수 호출을 사용하여 변수를 추가하려는 시도를 감지함으로써 루아에서이를 어느 정도 할 수 있습니다.

이는 '추적 테이블에 액세스한다 "에 루아 책에서 프로그래밍 여기에 덮여 :

http://www.lua.org/pil/13.4.4.html

관련 항목
http://www.gammon.com.au/forum/?id=10887

+0

답해 주셔서 감사합니다! 테이블 요소에 액세스 할 때 유용합니다. 지역 변수/상승 값 만 추적해야하는 경우 어떻게해야합니까? – SatheeshJM

+0

내가 게시 한 "참고"링크에 따르면 지역 변수를 추적하는 것은 실제로 루아에서 이루어진 일이 아니며 디버거가없는 다른 프로그래밍 언어에서도 마찬가지입니다. 당신은 Object Properties : http://lua-users.org/wiki/ObjectProperties를 살펴볼 수도 있습니다. 이것을 사용하면 알려줄 설정자를 만들 수 있습니다. –

+0

이 래퍼와 알림을 제공하는 무료 라이브러리를 만들었습니다. https://github.com/Phrogz/notifitable – Phrogz