Wie schon in Fehler finden und beheben angesprochen wurde, sind Skripte nach dem Erstellen meist nicht fehlerfrei. In Häufige Fehler werden häufige Stolpersteine angesprochen, sobald aber Skripte und damit auch die möglichen Fehler komplexer werden, wird das Debugging schwerer. Daher sollen auf dieser Seite Strategien vorgestellt werden, mit denen auch kompliziertere Bugs gefunden werden können.
Üblicherweise unterscheidet man drei Arten von Fehlern:
GetPosition("EntityNameWithATypo")
oder
Logic.CreateEntity("PU_Serf", pos.X, pos.Y, rot, pId)
In jedem Fall wird die jeweilige Funktion nicht ausgeführt. Falls eine der Comfortfunktionen falsch benutzt wird, kommt es üblicherweise zu einem „assertion failed“, bei anderen Funktionen wie z.B. den Logic-Funktionen können die Konsequenzen von „garnichts“ bis zu einem Spielabsturz reichen.
Da syntaktische Fehler von dem Debugger mit Zeilenangabe gefunden werden, werden diese im Folgenden nicht beachtet werden.
Die hier vorgestellten Strategien sind nach Aufwand und Verzweiflungslevel geordnet, daher ist es empfohlen, mit die Methoden in der vorgestellten Reihenfolge abzuarbeiten.
Um Fehler zu finden, ist es hilfreich, zu verstehen, welche Variable zu welchem Zeitpunkt welchen Wert besitzt. Die einfachste Methode, den Inhalt von Variablen zu einem gewissen Zeitpunkt auszulesen, ist es, den Wert mittels
Message
oder
LuaDebugger.Log
auszugeben. Hierbei ist es sinnvoll, zwei Regeln zu folgen:
TODO: Beispiel bringen?
Falls die erste Strategie nicht ausreichend ist, um zu verstehen, was im Code nicht so abläuft wie erwartet, wäre es schön, den Code einfach anhalten zu können. Glücklicherweise ist genau das mit Breakpoints möglich! Wird mit aktivem LuaDebugger die Funktion
LuaDebugger.Break
ausgeführt, so wird Siedler pausiert und es ist möglich, mithilfe des Debuggers den Wert der im aktuellen Scope verfügbaren Variablen ausgeben zu lassen. Außerdem ist es möglich, mithilfe des LuaDebuggers das Programm danach Schritt für Schritt ausführen zu lassen. Während der Breakpoint ausgelöst ist, verändert sich die Oberfläche des LuaDebuggers etwas:
Achtung: Werden im Multiplayer Breakpoints gesetzt, so wird, während die Pause aktiv ist, auch die Kommunikation mit dem Server pausiert. Daher ist es möglich, dass der Server, da dieser keine Pakete vom Client erhält, die Verbindung trennt.
TODO: Beispiel?