Lua - debugowanie
Lua udostępnia bibliotekę debugowania, która zapewnia wszystkie prymitywne funkcje potrzebne do stworzenia własnego debugera. Mimo że nie ma wbudowanego debuggera Lua, mamy wiele debuggerów dla Lua, stworzonych przez różnych programistów, z których wielu jest open source.
Funkcje dostępne w bibliotece debugowania Lua są wymienione w poniższej tabeli wraz z ich zastosowaniami.
Sr.No. | Metoda i cel |
---|---|
1 | debug() Wchodzi w tryb interaktywny do debugowania, który pozostaje aktywny, dopóki nie wpiszemy tylko cont w linii i nie naciśniemy enter. Użytkownik może przeglądać zmienne w tym trybie za pomocą innych funkcji. |
2 | getfenv(object) Zwraca środowisko obiektu. |
3 | gethook(optional thread) Zwraca bieżące ustawienia zaczepienia wątku jako trzy wartości - bieżącą funkcję zaczepienia, bieżącą maskę zaczepienia i bieżącą liczbę zaczepów. |
4 | getinfo(optional thread, function or stack level, optional flag) Zwraca tabelę z informacjami o funkcji. Możesz podać funkcję bezpośrednio lub możesz podać liczbę jako wartość funkcji, co oznacza, że funkcja działa na poziomie funkcja stosu wywołań danego wątku - poziom 0 jest bieżącą funkcją (samo getinfo); poziom 1 to funkcja, która wywołuje getinfo; i tak dalej. Jeśli funkcja jest liczbą większą niż liczba aktywnych funkcji, to getinfo zwraca nil. |
5 | getlocal(optional thread, stack level, local index) Zwraca nazwę i wartość zmiennej lokalnej z indeksem lokalnym funkcji na poziomie stosu. Zwraca nil, jeśli nie ma zmiennej lokalnej o podanym indeksie i zgłasza błąd, gdy jest wywoływana z poziomem spoza zakresu. |
6 | getmetatable(value) Zwraca metatabelę danego obiektu lub nil, jeśli nie ma metatablicy. |
7 | getregistry() Zwraca tabelę rejestru, wstępnie zdefiniowaną tabelę, której może użyć dowolny kod C do przechowywania dowolnej wartości Lua, którą musi przechowywać. |
8 | getupvalue(function, upvalue index) Ta funkcja zwraca nazwę i wartość upvalue z indeksem w górę funkcji func. Funkcja zwraca nil, jeśli nie ma upvalue o podanym indeksie. |
9 | setfenv(function or thread or userdata, environment table) Ustawia środowisko danego obiektu na podaną tabelę. Zwraca obiekt. |
10 | sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count) Ustawia daną funkcję jako punkt zaczepienia. Maska ciągów i liczba liczb określają, kiedy zostanie wywołany hak. Tutaj c, r i l są wywoływane za każdym razem, gdy Lua wywołuje, zwraca i wprowadza odpowiednio każdy wiersz kodu w funkcji. |
11 | setlocal(optional thread, stack level, local index, value) Przypisuje wartość do zmiennej lokalnej z indeksem lokalnym funkcji na poziomie stosu. Funkcja zwraca nil, jeśli nie ma zmiennej lokalnej o podanym indeksie, i wywołuje błąd, gdy jest wywoływana z poziomem spoza zakresu. W przeciwnym razie zwraca nazwę zmiennej lokalnej. |
12 | setmetatable(value, metatable) Ustawia metatabelę dla danego obiektu na podaną tabelę (która może być zerowa). |
13 | setupvalue(function, upvalue index, value) Ta funkcja przypisuje wartość do upvalue z indeksem w górę funkcji func. Funkcja zwraca nil, jeśli nie ma upvalue o podanym indeksie. W przeciwnym razie zwraca nazwę upvalue. |
14 | traceback(optional thread, optional message string, optional level argument) Tworzy rozszerzony komunikat o błędzie ze śledzeniem wstecznym. |
Powyższa lista jest pełną listą funkcji debugowania w Lua i często używamy biblioteki, która używa powyższych funkcji i zapewnia łatwiejsze debugowanie. Korzystanie z tych funkcji i tworzenie własnego debuggera jest dość skomplikowane i nie jest preferowane. W każdym razie zobaczymy przykład prostego użycia funkcji debugowania.
function myfunction ()
print(debug.traceback("Stack trace"))
print(debug.getinfo(1))
print("Stack trace end")
return 10
end
myfunction ()
print(debug.getinfo(1))
Kiedy uruchomimy powyższy program, otrzymamy ślad stosu, jak pokazano poniżej.
Stack trace
stack traceback:
test2.lua:2: in function 'myfunction'
test2.lua:8: in main chunk
[C]: ?
table: 0054C6C8
Stack trace end
W powyższym programie przykładowym ślad stosu jest drukowany przy użyciu funkcji debug.trace dostępnej w bibliotece debugowania. Plik debug.getinfo pobiera aktualną tabelę funkcji.
Debugowanie - przykład
Często potrzebujemy znać lokalne zmienne funkcji do debugowania. W tym celu możemy użyć getupvalue, a do ustawienia tych zmiennych lokalnych używamy setupvalue. Poniżej przedstawiono prosty przykład.
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())
Kiedy uruchomimy powyższy program, otrzymamy następujące dane wyjściowe.
1
2
index 1 k = 1
index 2 n = 2
11
W tym przykładzie licznik aktualizuje się o jeden po każdym wywołaniu. Aktualny stan zmiennej lokalnej możemy zobaczyć za pomocą funkcji getupvalue. Następnie ustawiamy zmienną lokalną na nową wartość. Tutaj n wynosi 2 przed wywołaniem operacji zbioru. Używając funkcji setupvalue, jest aktualizowana do 10. Teraz, gdy wywołujemy funkcję licznika, zwróci ona 11 zamiast 3.
Typy debugowania
- Debugowanie wiersza poleceń
- Graficzne debugowanie
Debugowanie wiersza poleceń
Debugowanie wiersza poleceń to rodzaj debugowania, w którym do debugowania używa się wiersza poleceń za pomocą poleceń i instrukcji drukowania. Istnieje wiele debuggerów wiersza poleceń dostępnych dla Lua, z których kilka jest wymienionych poniżej.
RemDebug- RemDebug to zdalny debugger dla Lua 5.0 i 5.1. Pozwala zdalnie sterować wykonywaniem innego programu Lua, ustawiać punkty przerwania i sprawdzać aktualny stan programu. RemDebug może również debugować skrypty CGILua.
clidebugger- Prosty debugger interfejsu wiersza poleceń dla Lua 5.1 napisany w czystym Lua. Nie jest zależny od niczego innego niż standardowe biblioteki Lua 5.1. Został zainspirowany RemDebug, ale nie ma swoich zdalnych obiektów.
ctrace - Narzędzie do śledzenia wywołań Lua API.
xdbLua - Prosty debugger wiersza poleceń Lua dla platformy Windows.
LuaInterface - Debugger- Ten projekt jest rozszerzeniem debuggera dla LuaInterface. Podnosi wbudowany interfejs debugowania Lua na wyższy poziom. Interakcja z debugerem odbywa się za pomocą zdarzeń i wywołań metod.
Rldb- To jest zdalny debugger Lua przez gniazdo, dostępny zarówno w systemie Windows, jak i Linux. Zapewnia znacznie więcej funkcji niż jakikolwiek istniejący.
ModDebug - Pozwala to na zdalne sterowanie wykonaniem innego programu Lua, ustawianie punktów przerwania i sprawdzanie aktualnego stanu programu.
Graficzne debugowanie
Debugowanie graficzne jest dostępne za pomocą IDE, w którym zapewnia się wizualne debugowanie różnych stanów, takich jak wartości zmiennych, ślady stosu i inne powiązane informacje. Istnieje wizualna reprezentacja i kontrola wykonania krok po kroku za pomocą punktów przerwania, przechodzenia do, przechodzenia i innych przycisków w IDE.
Istnieje wiele graficznych debuggerów dla Lua i zawiera następujące.
SciTE - Domyślne środowisko IDE systemu Windows dla Lua zapewnia wiele funkcji debugowania, takich jak punkty przerwania, krok, krok do, krok po kroku, obserwowanie zmiennych i tak dalej.
Decoda - To jest graficzny debugger z obsługą zdalnego debugowania.
ZeroBrane Studio- Lua IDE ze zintegrowanym zdalnym debugerem, widokiem stosu, widokiem zegarka, zdalną konsolą, analizatorem statycznym i nie tylko. Działa z silnikami LuaJIT, Love2d, Moai i innymi silnikami Lua; Windows, OSX i Linux. Otwarte źródło.
akdebugger - Wtyczka debuggera i edytora Lua dla Eclipse.
luaedit - Obejmuje zdalne debugowanie, debugowanie lokalne, podświetlanie składni, listę propozycji ukończenia, silnik propozycji parametrów, zaawansowane zarządzanie punktami przerwania (w tym system warunków na punktach przerwania i liczbę trafień), listę funkcji, listę zmiennych globalnych i lokalnych, zegarki, zarządzanie zorientowane na rozwiązania.