Heyho
heute möchte ich ein
Teil meines Wissens mit euch teilen und euch
ein paar
Tipps und Tricks verraten, wie ihr eure
Quests ganz
einfach debuggen könnt.
Eines Vorab, das hier soll
kein weiterer
Questhilfethread werden,
sondern lediglich Informationen liefern, wie ihr euch
selber,
aber einfacher die
Lösungen erarbeiten könnt!
Wikipedia Debugger:
Ein Debugger (von engl. bug im Sinne von Programmfehler) ist ein Werkzeug
zum Diagnostizieren und Auffinden von Fehlern in Computersystemen,
dabei vor allem in Programmen...
- DONT make WITH make!!
- syserr's live auslesen
- syserrs von Quests mit Zeilenangabe ansehen
- Ingame Dump-Funktion für Tabellen
1.) DONT make WITH make!!
Bei einer Umfrage habe ich von 90% der Leute gehört, dass sie beim programmieren jedesmal mit
PHP Code:
make
python make.py
sh make.sh
oder Vergleichbarem ihre Quests kompilieren.
Kurzer Exkurs (Funktionsweise make):
Das "make-Script" in welcher Sprache auch immer es geschrieben ist macht nichts anderes als jede Datei die in der locale_list (hier gibt es auch namensabweichungen) steht einzeln zu kompilieren!
Wenn ich also eine Quest bearbeite, dann kann ich es mir schenken alle anderen Quests (die funktionieren (sollten

)) auch nochmal zu kompilieren!
An denen hat sich normalerweise nichts geändert.
Wie kompiliere ich nun meine quest?
Ich wechsel in den quest Ordner
Falls ihr diesen Symlink nicht habt, legt ihn am besten gleich an!
PHP Code:
ln -s /PFAD/ZU/MEINEN/FILES/share/locale/germany/quest /root/quest
und kompiliere meine Quest so
PHP Code:
./qc Ordnername/Questname.quest
Fazit:
Ich spare Zeit!!
Die Ausgabe ist übersichtlich(er).
2.) syserr's live auslesen
Erschreckenderweise ist meine Umfrage hier ähnlich schlecht verlaufen.
(Ja, ok ich habe nur 9 andere gefragt und mich selbst hinzugezählt

)
Also 70% laden die syserr Datei jedesmal umständlich mit Filezilla oder ähnlichen FTP-Programmen runter.
10% wussten nichtmal das es eine syserr gibt, schönen Gruß an BlaueShorts!
Mit ein paar Schritten zum live-Debugging:
PHP Code:
MYPATH="/PFAD/ZU/MEINEN/FILES"; #Hier den PFAD ersetzen, danach nichtmehr
#Pfad anlegen
mkdir -p $MYPATH/share/logs ;
#Fakesyserr anlegen (sonst macht ihr eure Shell kaputt)
touch $MYPATH/share/logs/syserr ;
#alias anlegen
echo -e "\nalias syserr tail -f $MYPATH/*/*/syserr" >>/root/.cshrc ;
#In eine neue Shell wechseln, damit der alias funktioniert
su ;
Nun habt ihr das live-Debugging vorbereitet und könnt es testen wenn euere Cores laufen.
Dazu gebt ihr einfach folgendes in eure Konsole ein:
(Abbrechen mit "Strg" + "c")
Fazit:
Mit der Liveansicht sehe ich direkt wenn ich Ingame was anklicke, ob es einen Fehler erzeugt!
Wenn dort durchgehend neue Zeilen kommen, habt ihr nicht nur einen Fehler
3.) syserrs von Quests mit Zeilenangabe ansehen
Ich habe zum Verständnis mal einen solchen Fehler reproduziert:
PHP Code:
SYSERR: May 5 20:32:07 :: RunState: LUA_ERROR: locale/germany/quest/object/state/dumper:23: bad argument #1 to `foreach' (table expected, got string)
Da viele ihren Quests nach belieben die Namen geben,
wissen sie
nicht direkt um
welche quest es sich handelt.
Viele denken auch, dass sie in ihrer ausgedachte.quest Datei den
Fehler an Zeile 23 finden würden.
Dem ist
natürlich nicht so. Der Fehler ist in der kompilierten Datei an Zeile 23, das
kann in eurem Original aber
auch Zeile 30 sein.
Damit ihr leicht rausfindet was in dieser Zeile steht, können wir uns wieder
ein Werkzeug zur Hilfe nehmen:
Das
quest_debug.sh!
Einbau in wenigen Schritten:
PHP Code:
#Wir brauchen "bash" und den symlink (Standardkonfiguration ist passend)
cd /usr/ports/shells/bash && make install clean
ln -s /usr/local/bin/bash /bin/bash
#Ordner erstellen
mkdir /root/tools ;
#TODO: Ladet das quest_debug.sh in diesen Ordner -> /root/tools
#Rechte vergeben
chmod +x /root/tools/quest_debug.sh ;
#Alias anlegen
echo -e "\nalias qd /root/tools/quest_debug.sh" >>/root/.cshrc ;
#Symlink zu euren Files anlegen
ln -s /PFAD/ZU/MEINEN/FILES /root/mt2;
su ; #Ihr wisst wofür..
Wie benutze ich dieses Werkzeug nun?
Eine kurze Anleitung steht dort wenn ihr
eingebt.
Auf unser Beispiel bezogen sieht der Aufruf so aus:
PHP Code:
qd locale/germany/quest/object/state/dumper:23
#Darauf folgt diese Ausgabe:
/root/mt2/share/locale/germany/quest/object/state/dumper:
13. end
14. dump ( "" , mytablename )
15. syschat ( "#######START DEBUG - " .. debuginfo .. " ###########" )
16. table . foreach ( floke , function ( _ , a ) syschat ( _ .. ". " .. a ) end )
17. syschat ( "########ENDE DEBUG - " .. debuginfo .. " ###########" )
18. end ,show= function (m,i)if i == nil then
19. i = ""
20. end
21. local function dump ( t , h )
22. local t = t or ""
23. for k , l in pairs ( t ) begin
24. local d = h .. "(" .. tostring ( k ) .. ")"
25. if type ( l ) == "table" then
26. syschat ( d .. ":" )
27. dump ( l , h .. " " )
28. else
29. syschat ( d .. " = " .. tostring ( l ) )
30. end
31. end
32. end
33. syschat ( "#######START DEBUGSHOW - " .. i .. " ###########" )
Fazit:
Man spart Zeit, da man sich nicht erst die entsprechende Datei per Filezilla runterladen muss und dann noch die passende Zeile suchen...
4.) Ingame Dump-Funktion für Tabellen
Ich selber habe bei
komplizierten Tabellen oftmals
ein Problem, dass ich nicht weiß,
an
welcher Stelle sich jetzt das von mir
gesuchte Objekt befindet und da ich Ratespielchen nicht mag,
habe ich ein
weiteres Werkzeug speziell hierfür gebaut:
Dumper.quest
Warum ich das nicht als Funktion für die questlib.lua gebaut habe?
Ich mag die Endung .quest mehr als .lua :P
Es gibt genug Leute die alles in eine riesige Datei schreiben und die .lua Dateien nicht in Ordnern nach Funktionalität einsortieren.
Vorbereitung:
In die quest_functions eintragen:
dump
dumper.get
dumper.show
pairs
table.foreach
table.insert
type
tostring
Die Quest Dumper.quest in den Questordner und in der locale_list eintragen und kompilieren.
PHP Code:
cd /root/quest/;
./qc Dumper.quest
echo "Dumper.quest" >>locale_list
man man man, das solltet ihr aufjedenfall beherrschen...
Beispielquest zum Test der Funktion:
PHP Code:
quest beispiel begin
state start begin
when letter begin
send_letter("Beispiel-Menue")
end
when button or info begin
say_title("~~~Beispiel-Menü~~~")
say("Sieh in deinen syschat...")
say("Viel Spaß wünscht MrFloke!")
local Maus,blau="Elefant","schwarz"
local verwirrtable= {
["Tiere"]={
["Katzen"]={"Ushi", "Paula", {"Horst",["Essen"]=Maus}},
["Hunde"]={"Keine"}, --mit Tabelle
["Hundebabys"]="Keine" --ohne Tabelle
},
["Autos"]={
["Ford Focus"]={["owner"]="MrFloke",["farbe"]=blau}
}
}
dumper.get(verwirrtable, "Konfuse verwirrtable") --DEBUG
dumper.show(verwirrtable, "Lesbarere verwirrtable") --DEBUG
end
end
end
Meine Frage an euch: Welche Farbe hat mein Auto?
Fazit:
Ich sehe auf einen Blick welche Punkte sich in meiner Tabelle befinden.
Das beste: Ich weiß auch direkt wie ich sie Aufrufen kann
Abschlussworte:
Ich hoffe ich konnte euch ein paar interessante Infos mitteilen,
oder euch zumindest ein wenig erheitern
Sollten noch Fragen offen sein, beantworte ich diese gerne.
Ich habe natürlich noch viel mehr solcher nützlichen Tools,
also bin ich auf euer Feedback gespannt wie es so ankommt.