English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lua bietet die Debug-Bibliothek, um die Funktion der Erstellung unseres benutzerdefinierten Debuggers zu ermöglichen. Lua hat selbst keinen integrierten Debugger, aber viele Entwickler haben ihren Lua-Debugger-Code geteilt.
Die Lua-Debugging-Bibliothek enthält die folgenden Funktionen:
Nummer | Methode & Zweck |
---|---|
1. | debug(): Gibt in ein Benutzerinteraktionsmodus ein, führt jeden String, den der Benutzer eingibt, aus. Mit einfachen Befehlen und anderen Debugging-Einstellungen kann der Benutzer globale und lokale Variablen überprüfen, die Werte der Variablen ändern, einige Ausdrücke berechnen usw. |
2. | getfenv(object): Gibt die Umgebungsvariablen des Objekts zurück. |
3. | gethook(optional thread): Gibt drei Werte zurück, die die Einstellungen der Thread-Hooks darstellen: aktuelle Hook-Funktion, aktuelle Hook-Maske, aktuelle Hook-Zählung |
4. | getinfo ([thread,] f [, what]): Gibt ein Tableau mit Informationen über eine Funktion zurück. Sie können direkt die Funktion bereitstellen oder eine Zahl 'f' verwenden, um die Funktion zu darstellen. Die Zahl 'f' stellt die Funktion dar, die sich auf der Ebene 'f' im Aufrufstack der angegebenen Threads befindet: 0-Ebene stellt die aktuelle Funktion (getinfo selbst) dar; 1 Die Ebene stellt die Funktion dar, die getinfo aufgerufen hat (außer bei einer Endaufruf-Situation, in der dies nicht in die Stack-Zählung einbezogen wird); usw. Wenn 'f' eine Zahl ist, die 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 Variable zurück, deren Index 'local' im Stack auf der Ebene 'f' ist. Diese Funktion wird nicht nur für explizit definierte lokale Variablen verwendet, sondern auch für Formals, temporäre Variablen usw. |
6. | getmetatable(value): Legt den Metatable des Wertes, der durch den angegebenen Index verweist, auf den Stack. Wenn der Index ungültig ist oder der Wert keinen Metatable hat, wird die Funktion 0 zurückgeben und nichts auf den Stack legen. |
7. | getregistry(): Gibt den Registrierungstableau zurück, das ein vorgefertigtes Tableau ist und verwendet werden kann, um beliebige Lua-Werte zu speichern, die C-Code speichern möchte. |
8. | getupvalue (f, up) Diese Funktion gibt den Namen und den Wert des 'up'ten Aufrufwerts der Funktion 'f' zurück. Wenn diese Funktion keinen solchen Aufrufwert hat, wird 'nil' zurückgegeben. |
10. | sethook ([thread,] hook, mask [, count]): Fügen Sie eine Funktion als Hook-Funktion hinzu. Der String 'mask' und die Zahl 'count' bestimmen, zu welchem Zeitpunkt der Hook aufgerufen wird. Die Maske ist eine Zeichenkombination, die aus den folgenden Zeichen besteht, wobei jedem Zeichen eine Bedeutung zugeordnet ist:
|
11. | setlocal ([thread,] level, local, value): Diese Funktion weist value der lokalen Variable des Stack-Ebenen level der Funktion zu. Wenn die Variable nicht vorhanden ist, gibt die Funktion nil zurück. Wenn level aus dem Rahmen fällt, wird ein Fehler ausgelöst. |
12. | setmetatable (value, table): Setzt die Metatabelle von value auf table (kann nil sein). Gibt value zurück. |
13. | setupvalue (f, up, value): Diese Funktion setzt value auf den up-ten Wert der Funktion f. Wenn die Funktion keinen solchen Wert hat, wird nil zurückgegeben. Andernfalls wird der Name des Wertes zurückgegeben. |
14. | traceback ([thread,] [message [, level]]): Wenn message vorhanden ist und weder eine Zeichenkette noch nil ist, führt die Funktion keine Aktion durch und gibt message direkt zurück. Ansonsten gibt sie die Rückverfolgung der Aufrufstack zurück. Der optionale String message wird am Anfang der Rückverfolgung der Stack-Informationen hinzugefügt. Der optionale Zahl parameter level gibt an, ab welchem Stack-Ebene die Rückverfolgung beginnt (Standard ist 1 d.h. dort, wo traceback aufgerufen wird). |
Die obige Tabelle zeigt unsere häufig verwendeten Debugging-Funktionen. Als nächstes können wir einige einfache Beispiele betrachten:
function myfunction() print(debug.traceback("Stack trace")) print(debug.getinfo(1)) print("Stack trace end") return 10 end myfunction() print(debug.getinfo(1))
Die Ausgabe des obigen Codes ist:
Stack trace stack traceback: test2.lua:2: in Funktion 'myfunction' test2.lua:8: in main chunk [C]: ? table: 0054C6C8 Stack trace end
In diesem Beispiel verwenden wir die Funktionen traceback und getinfo aus der debug-Bibliothek, wobei getinfo Informationen über Funktionen zurückgibt.
Wir benötigen oft die Debugging von lokalen Variablen innerhalb von Funktionen. Wir können die Funktion getupvalue verwenden, um diese lokalen Variablen zu setzen. Ein Beispiel ist wie folgt:
function newCounter () lokale n = 0 lokale k = 0 return function () k = n n = n + 1 return n end end counter = newCounter() print(counter()) print(counter()) lokale i = 1 wiederhole 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 bis nicht name print(counter())
Die Ausgabe des obigen Codes ist:
1 2 index 1 k = = 1 index 2 n = = 2 11
In diesem Beispiel wird der Zähler bei jedem Aufruf um 1 erhöht1. Im Beispiel haben wir die Funktion getupvalue verwendet, um den aktuellen Zustand der lokalen Variablen anzuzeigen. Wir können lokale Variablen auf neue Werte setzen. Im Beispiel war der Wert von n vor der Einstellung 2, verwenden Sie die Funktion setupvalue, um es zu setzen 10. Jetzt rufen wir die Funktion auf, geben nach der Ausführung aus 11 statt 3.
Kommandozeilen-Debugging
Grafische Bedieneroberfläche-Debugging
Kommandozeilen-Debugger sind: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.
Grafische Debugger sind: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.