Lua-Debug
Lua bietet eine Debug-Bibliothek zum Erstellen benutzerdefinierter Debugger. Lua selbst verfügt über keinen integrierten Debugger, aber viele Entwickler haben ihren Lua-Debugger-Code geteilt.
Die Debug-Bibliothek in Lua enthält die folgenden Funktionen:
| Nein. | Methode & Beschreibung |
|---|---|
| 1. | debug(): Startet einen interaktiven Modus mit dem Benutzer, wobei jede vom Benutzer eingegebene Zeichenkette ausgeführt wird. Mit einfachen Befehlen und anderen Debug-Einstellungen kann der Benutzer globale und lokale Variablen untersuchen, Variablenwerte ändern, Ausdrücke auswerten und so weiter. |
| 2. | getfenv(object): Gibt die Umgebung des Objekts zurück. |
| 3. | gethook(optional thread): Gibt drei Werte zurück, die die Thread-Hook-Einstellungen darstellen: die aktuelle Hook-Funktion, die aktuelle Hook-Maske und die aktuelle Hook-Anzahl. |
| 4. | getinfo ([thread,] f [, what]): Gibt eine Tabelle mit Informationen über eine Funktion zurück. Sie können die Funktion direkt angeben oder eine Zahl f verwenden, um sie zu repräsentieren. Die Zahl f repräsentiert die Funktion auf der entsprechenden Ebene des Aufrufstapels, der auf dem angegebenen Thread ausgeführt wird: Ebene 0 ist die aktuelle Funktion (getinfo selbst); Ebene 1 ist die Funktion, die getinfo aufgerufen hat (es sei denn, es ist ein Tail-Call, der nicht auf dem Stapel gezählt wird); und so weiter. Wenn f eine Zahl größer als die Anzahl der aktiven Funktionen ist, gibt getinfo nil zurück. |
| 5. | debug.getlocal ([thread,] f, local): Diese Funktion gibt den Namen und den Wert der lokalen Variablen mit dem Index local der Funktion auf Ebene f im Stapel zurück. Diese Funktion wird nicht nur verwendet, um auf explizit definierte lokale Variablen zuzugreifen, sondern auch auf formale Parameter, temporäre Variablen usw. |
| 6. | getmetatable(value): Legt die Metatabelle des Werts, auf den der angegebene Index zeigt, auf den Stack. Wenn der Index ungültig ist oder der Wert keine Metatabelle hat, gibt die Funktion 0 zurück und legt nichts auf den Stack. |
| 7. | getregistry(): Gibt die Registry-Tabelle zurück, eine vordefinierte Tabelle, die verwendet werden kann, um jeden Lua-Wert zu speichern, den C-Code speichern möchte. |
| 8. | getupvalue (f, up) Diese Funktion gibt den Namen und Wert des up-ten Upvalues der Funktion f zurück. Wenn die Funktion diesen Upvalue nicht hat, gibt sie nil zurück. |
| 10. | sethook ([thread,] hook, mask [, count]): Legt eine Funktion als Hook-Funktion fest. Der String mask und die Zahl count bestimmen, wann der Hook aufgerufen wird. Die Maske ist ein String, der aus den folgenden Zeichen besteht, deren Bedeutung jeweils angegeben ist:
|
| 11. | setlocal ([thread,] level, local, value): Diese Funktion weist value der local-ten lokalen Variablen der Funktion auf Ebene level im Stack zu. Wenn diese Variable nicht existiert, gibt die Funktion nil zurück. Wenn level außerhalb des gültigen Bereichs liegt, löst sie einen Fehler aus. |
| 12. | setmetatable (value, table): Setzt die Metatabelle von value auf table (die nil sein kann). Gibt value zurück. |
| 13. | setupvalue (f, up, value): Diese Funktion setzt value als den up-ten Upvalue der Funktion f. Wenn die Funktion diesen Upvalue nicht hat, gibt sie nil zurück; andernfalls gibt sie den Namen dieses Upvalues zurück. |
| 14. | traceback ([thread,] [message [, level]]): Wenn message vorhanden ist und weder eine Zeichenkette noch nil ist, gibt die Funktion message direkt zurück, ohne etwas anderes zu tun. Andernfalls gibt sie die Stack-Traceback-Informationen des Aufruf-Stacks zurück. Die optionale Zeichenkette message wird am Anfang des Stack-Tracebacks hinzugefügt. Die optionale Zahl level gibt an, auf welcher Ebene des Stacks die Rückverfolgung beginnen soll (Standard ist 1, d. h. dort, wo traceback aufgerufen wird). |
Die obige Tabelle listet die Debugging-Funktionen auf, die wir häufig verwenden. Als Nächstes können wir uns einige einfache Beispiele ansehen:
Beispiel
print(debug.traceback("Stack trace"))
print(debug.getinfo(1))
print("Stack trace end")
return 10
end
myfunction ()
print(debug.getinfo(1))
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
Stack trace stack traceback: test2.lua:2: in function 'myfunction' test2.lua:8: in main chunk [C]: ? table: 0054C6C8 Stack trace end
Im obigen Beispiel haben wir die Funktionen traceback und getinfo der debug-Bibliothek verwendet. Die Funktion getinfo wird verwendet, um eine Tabelle mit Funktionsinformationen zurückzugeben.
Ein weiteres Beispiel
Häufig müssen wir lokale Variablen innerhalb einer Funktion debuggen. Wir können die Funktion setupvalue verwenden, um diese lokalen Variablen zu setzen. Ein Beispiel ist wie folgt:
Beispiel
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())
Das Ausführen des obigen Codes erzeugt die folgende Ausgabe:
1 2 index 1 k = 1 index 2 n = 2 11
Im obigen Beispiel wird der Zähler bei jedem Aufruf um 1 erhöht. Im Beispiel haben wir die Funktion getupvalue verwendet, um den aktuellen Zustand der lokalen Variablen anzuzeigen. Wir können die lokale Variable auf einen neuen Wert setzen. Im Beispiel ist der Wert von n vor dem Setzen 2. Mit der Funktion setupvalue setzen wir ihn auf 10. Jetzt rufen wir die Funktion auf, und nach der Ausführung ist die Ausgabe 11 statt 3.
Debugging-Typen
- Debugging über die Kommandozeile
- GUI-Debugging
Zu den Kommandozeilen-Debuggern gehören: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.
Zu den GUI-Debuggern gehören: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.
Weitere Erweiterungen