Lua Debugger für S5 & S6

» Settlers Map Source Forums » Mapping » Lua Debugger für S5 & S6

Pages: 1 2 3 Next page

yoq
#1
03-08-2014 22:04
Posts: 91

Lua Debugger für S5 & S6

Ich möchte mein neuestes, und vermutlich letztes Projekt für Siedler vorstellen: Ein Lua Debugger, für Siedler DEdK & AeK

Features
- direkte Anzeige von Fehlern im Quellcode
- Stack Trace (von wo wurde die Funktion aufgerufen)
- Breakpoints, sowohl im MapScript als auch im internen Code
- Schrittweises Ausführen von Code (Step Over/In/Out)
- anzeigen und ändern von Variableninhalten (auch für locals und upvalues)
- Lua Konsole (eingegebener Code wird direkt ausgeführt, Anzeige des Ergebnisses, klickbare Funktionen)
- Cutscene Editor für Siedler5 mit "Flugzeugsteuerung"

Anwendungshinweise
- Beim Debuggen ist der Window-Mode zu empfehlen (für S5 hier, bei S6 Options.ini editieren)
- Vorraussetzung ist .NET Framework 3.5, dies sollte auf jedem PC vorhanden sein.
- ClosedMapLoader zum Debuggen deaktivieren
- Markierter Code aus der Code-Anzeige wird in die Konsole kopiert und ausgeführt. Um so etwa den Inhalt einer Variable anzusehen, einfach auf diese Doppelklicken (=schnell markieren).
- Doppelklick auf Funktionsnamen um die Zeile der Definition auszugeben
- Falls die Installation nicht gefunden wird, kann mit einem Klick auf "Installation not found" der Installationsordner ausgewählt werden

Breakpoints
- Breakpoints funktionieren nur, wenn in der Zeile wirklich etwas ausgeführt wird. (Zuweisung, Funktionsaufruf, erste Zeile einer Table Definition, if, etc..)
- Wenn ein Breakpoint getroffen wird, können die Step Befehle verwendet werden
- Um per Skript einen Breakpoint einzufügen: LuaDebugger.Break()
- Nach einem Lua Error können Variableninhalte gelesen werden, allerdings ist nur Resume möglich: normales Verhalten, das Skript wird an dieser Stelle abgebrochen

Hinweise S6
- Um Debuggen zu können, muss der Development Mode aktiviert werden. Dieser kann per Knopfdruck (de)aktiviert werden, benötigt jedoch erweiterte Rechte um den Modus per Registry freizuschalten. Der Dev Mode aktiviert schaltet allerdings einige Entwickler-Buttons und Tastenkombis frei.

Screenshot


Download: http://settlers.pro/downloads/LuaDebugger_v0.5.5.exe

Technischer Hintergrund
BlueByte hat in die Siedler-Spiele 5&6 eine Debug-Schnittstelle integriert, den eigentlichen Debugger aber nicht veröffentlicht. Die Schnittstelle selbst existiert jedoch auch im normalen Spiel. Über diese Schnittstelle wurde vor einigen Jahren der ClosedMapLoader implementiert, daher muss dieser deaktiviert werden um den Debugger zu verwenden. Der LuaDebugger ist eine komplette Neuentwicklung, basierend auf den Funktionen die diese Schnittstelle zur Verfügung stellt.
Das Programm ist in C# geschrieben, den Source Code findet ihr hier: http://bitbucket.org/settlersdev/settlersluadebugger
Beiträge - bestenfalls in Code-Form - sind ausdrücklich erwünscht.

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

This posting has been edited by yoq: 14-04-2017 at 22:53.

wilma456
#2
05-08-2014 14:36
Posts: 458

Ich finde das Programm nützlich. Da Ich sowohl als Maper als auch als Tester tätig bin, hilft es ungemein. Ist auch witzig, sich mal die Spielinternen Skripte oder die der Kampagne anzusehen. Allerdings habe ich ein Problem (siehe hier). Dafür hat alles andere problemlos funktioniert.

Posted by yoq:
BlueByte hat in die Siedler-Spiele 5&6 eine Debug-Schnittstelle integriert, den eigentlichen Debugger aber nicht veröffentlicht. Die Schnittstelle selbst existiert jedoch auch im normalen Spiel.


Die Entwickler vergessen bei den meisten Spielen, ihr unbenutztes Zeug rauszunehmen.

____________________
Schlacht um Crawford

Wilmasmod

andre111
#3
05-08-2014 15:01
Posts: 220

Das ist sehr nützlich, danke.

Ich hätte noch einen Vorschlag:
Eine Möglichkeit den Debugger mit Argumenten zu starten, so dass direkt das Spiel mit einer Map gestartet wird. Ich habe mir ein kleines batch script geschrieben, das meine Map packt und in den richtigen Ordner kopiert. Zurzeit startet es das Spiel direkt mit der Map und es wäre super den Debugger direkt mit der Map zu starten.

edit: Vieleicht noch mit der Möglichkeit die Resolution nur für den einen Start zu ändern.

This posting has been edited by andre111: 05-08-2014 at 15:10.

yoq
#4
05-08-2014 21:40
Posts: 91

Argumente ans Spiel weiterzuleiten wird kein Problem sein - kommt auf die Todo Liste.

Die Sache mit der Auflösung/Window-Mode ist, dass diese Einstellung (zumindest bei S5) in der Registry liegt, und dann jedes Mal Admin-Rechte angefordert werden müssten. Mal sehen.


Was eine echte im Moment eine echte Einschränkung ist, sind Savegames. Da zu diesem Zeitpunkt alle lua Files geladen wurden, komme ich (zumindest via Debug Interface) nicht mehr an die Dateiinhalte. (Die drei Dateien die zu sehen sind, sind Überbleibsel aus einem GUI-Test und werden normalerweise gelöscht sobald die erste Datei geladen wird)

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

bobby
#5
08-08-2014 10:44
Posts: 393

Wie gewöhnlich gibt es jetzt auch wieder eine Seite auf thesettlers.tk für den Debugger.

Haben es erst zwei Leute ausprobiert oder was?
Das Teil ist wirklich nützlich und noch nicht wirklich getestet also bitte mal verwenden.

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

This posting has been edited by bobby: 24-03-2016 at 14:19.

SGM_Panzer
#6
08-08-2014 11:35
Posts: 322

Das Tool eröffnet ja ganz neue Möglichkeiten, allein das Testen dürfte damit umfangreicher und besser werden...

Und endlich kann ich die Kampangenscripts lesen... hehe

Danke für das Tool

____________________
GameForce meets Youtube!

Maps in Arbeit (Klick):

Crystal Thunderball
- Scriptphase

mcb
#7
08-08-2014 11:53
Posts: 1367

Ich habs mir sofort runtergeladen, und kann es nicht testen , weil ich im Urlaub bin und die CD vergessen hab...
Ihr wisst ja gar nicht wie sehr man den StackTrace von Java vermissen kann

totalwarANGEL
#8
08-08-2014 13:52
Posts: 2069

Igit, ein Java-Programm... (ich hab ne Abneigung gegen Java)

Okay, jetzt aber mal ernsthaft: Der AeK-Part scheint gar nicht zu funktionieren. Ich probiere weiter...

---------------------------

---------------------------
System.ArgumentException: Der Typ des Wertobjekts entspricht nicht der angegebenen RegistryValueKind, oder das Objekt konnte nicht richtig konvertiert werden.

bei System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)

bei Microsoft.Win32.RegistryKey.SetValue(String name, Object value, RegistryValueKind valueKind)

bei Microsoft.Win32.Registry.SetValue(String keyName, String valueName, Object value, RegistryValueKind valueKind)

bei LuaDebuggerStarter.Program.SetS6DevKey()
---------------------------
OK   
---------------------------



____________________
Liebe ist wie ein Kopfschuss!

bobby
#9
08-08-2014 14:26
Posts: 393

Ist eig. kein Java Programm...
Wie auf der Seite steht AeK ist sozusagen noch in der Beta

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

totalwarANGEL
#10
08-08-2014 16:28
Posts: 2069

Posted by bobby:
Ist eig. kein Java Programm...


Die Meldung sah so bäh... nach Java aus.

Darf man fragen wie sehr Beta es ist?

____________________
Liebe ist wie ein Kopfschuss!

bobby
#11
08-08-2014 16:39
Posts: 393

Naja das muss noch herausgefunden werden.
Zumindest beim Addon sollte die Konsole funktionieren!

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

yoq
#12
08-08-2014 21:15
Posts: 91

@twA

Schon richtig, C# ist Java sehr ähnlich - und IMO deutlich besser.

Zu deinem Fehler: schwer nachvollziehbar, "key" ist fix vom Typ UInt32, wieso sollte die Konvertierung plötzlich nicht funktionieren?

public static void SetS6DevKey()
{
    UInt32 key = CalculateDevHash(System.Environment.MachineName);

    try
    {
        Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Ubisoft\The Settlers 6\Development", "DevelopmentMachine", key, RegistryValueKind.DWord);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}


Könnte evtl. sein, dass ältere .NET Framework Versionen hier einen Bug haben.

Ich hab den Schlüssel mal testweise in einen normalen int gecastet und noch eine MessageBox mit ein paar Debug-Infos eingebaut: http://b0bby.tk/downloads/ldb_twa_debug1.exe

Zum Thema Beta: Ja, die Unterstützung für AeK wurde in ein paar Stunden gebastelt und vielleicht 30min getestet, aber der Kern der Engine hat sich von DEdK zu AeK ja nicht geändert.
Grundsätzlich sind aber alle Features in AeK vorhanden und funktionieren zumindest auf meinem PC

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

totalwarANGEL
#13
09-08-2014 01:08
Posts: 2069

---------------------------
twA Debug
---------------------------
Running CLR: 2.0.50727.8000
.NET Installs: CDF, v2.0.50727, v3.0, v3.5, v4, v4.0, 
Key: 0xf1b07001
---------------------------
OK   
---------------------------

Hilft das weiter?

Und wie bekomme ich den Debug-Key wieder raus? Seit dem ich das ausgeführt habe, ist der Editor nicht mehr zu gebrauchen. "Speichern" funktioniert nicht mehr. Es kommt die Meldung "Karte konnte nicht gespeichert werden". Seltsamer Weise funktioniert "Speichern unter" noch.

____________________
Liebe ist wie ein Kopfschuss!

This posting has been edited by totalwarANGEL: 09-08-2014 at 03:11.

totalwarANGEL
#14
09-08-2014 03:13
Posts: 2069

Mal so nebenbei:

Posted by yoq:
Schon richtig, C# ist Java sehr ähnlich - und IMO deutlich besser.

Kann ich nicht beurteilen... ich werde mit Java auf Linux gequält. C++ fand ich noch schon, aber Java... das gesamte Programm ein Objekt und keine schnell abgetippten Funktionen außerhalb von Klassen mehr möglich... kotz...

____________________
Liebe ist wie ein Kopfschuss!

yoq
#15
09-08-2014 12:04
Posts: 91

Kleines Update: http://b0bby.tk/downloads/LuaDebugger_v0.2.1.exe
Der Development Mode kann nun per Klick wieder deaktiviert werden.
Beim normalen Spiel wird zusätzlich zum Registry Key auch noch das Argument -DevM benötigt, daher hatte ich im MapEditor nicht nachgesehen.

Allerdings werden einige interessante Möglichkeiten / Überbleibsel aus DEdK freigeschalten:


____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

This posting has been edited by yoq: 14-04-2017 at 22:54.

totalwarANGEL
#16
09-08-2014 14:39
Posts: 2069

Posted by yoq:
Allerdings werden einige interessante Möglichkeiten / Überbleibsel aus DEdK freigeschalten:


Der Resourcenmanager ist das einzige, was brauchbar scheint. Das Importieren von Elementen klappt nicht... Nur der Standartinhalt. Aber das funktionierte auch ohne den Hack. Der Resmanager war aber unerreichbar. Ist er das jetzt nicht mehr?

Hey, ein Cutscene-Editor... ob der noch was bringt...
Okay, unbrauchbar.

____________________
Liebe ist wie ein Kopfschuss!

This posting has been edited by totalwarANGEL: 09-08-2014 at 16:00.

mcb
#17
09-08-2014 20:35
Posts: 1367

Verändert der Debugger irgendetwas an S5? Seit ich den debugger draufhabe, funktioniert meine Testmap nicht mehr... Bei anderen Maps habe ich kein Problem. Vielleicht liegt es an dem 800 KB (22000 Zeilen) Script, das ich importiere...
CopyTable nil, obwohl im Script vorhanden scheint auf einen Ladefehler hinzuweisen.

Edit: Liegt nicht an der Scriptgröße, sondern an metatables... Wenn ich die auskommentiere läuft es.

This posting has been edited by mcb: 09-08-2014 at 20:53.

yoq
#18
09-08-2014 21:19
Posts: 91

Ok, über metatables hab ich noch nicht nachgedacht
Könntest du ein kurzes script posten, dass den Fehler auslöst?

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

mcb
#19
09-08-2014 22:10
Posts: 1367


-- mcb
-- metatable-savegame-fix
-- 
-- metatable.set(table, metatable) anstatt setmetatable verwenden
-- Automatische Speicherung und Wiederherstellung nach dem Laden
-- metatable == nil löscht aus der Wiederherstellung und entfernt metatable
-- Ist ein table nur noch im Speicher für die Wiederherstellung, wird es trotzdem vom gc gelöscht (weak table)
-- Achtung, im Gegensatz zu setmetatable, wird das metatable kopiert, nicht referenziert!
-- 
-- Benötigt: CopyTable
metatable = {weak = {}, metas = {}, key = 0}
function metatable.set(tab, meta)
	assert(type(tab)=="table", "metatables koennen nur fuer tables gesetzt werden! "..tostring(tab))
	assert(type(meta)=="table" or meta==nil, "metatable muss table oder nil sein! "..tostring(meta))
	if not metatable.InitPlayerColorMapping then -- erster Aufruf: init Loaded-Callback & weak table
		metatable.InitPlayerColorMapping = InitPlayerColorMapping
		InitPlayerColorMapping = function()
			metatable.InitPlayerColorMapping()
			metatable.recreate()
		end
		metatable.recreate()
	end
	meta = CopyTable(meta) -- nötig für keySave bei verschiedenen tables mit demselben metatable
	local oldmeta = getmetatable(tab)
	setmetatable(tab, meta) -- setze metatable
	--metatable.weak[tab] = CopyTable(meta)   fehler!!! key = table => absturz!!!
	local k = 0
	if oldmeta and oldmeta.keySave and tab == metatable.weak[oldmeta.keySave] then -- hatte vorher schon metatable => alter key
		k = oldmeta.keySave
		if meta == nil then -- löschen!
			metatable.weak[k] = nil
			metatable.metas[k] = nil
			return
		end
	else -- neuer key
		k = metatable.key + 1
		metatable.key = k
	end
	metatable.weak[k] = tab
	metatable.metas[k] = meta
	meta.keySave = k
end
metatable.recreate = function()
	setmetatable(metatable.weak, {__mode = "v"}) -- weak table => wird gelöscht, wenn value nur noch dort referenziert ist
	setmetatable(metatable.metas, {__mode = "v"})
	for k, tab in pairs(metatable.weak) do
		setmetatable(tab, metatable.metas[k])
	end
end
testtable = {}
metatable.set(testtable, {__add = function() end})



Ohne den Debugger läuft das Script bei mir fehlerfrei...

yoq
#20
09-08-2014 22:43
Posts: 91

Was genau ist der Fehler, der bei dir auftritt?
Da mir CopyTable() fehlt und ich mit einer Kopie von hier kein Problem feststellen konnte, wäre es wohl am besten du sendest mir eine Kopie der Map die Probleme macht.

Ich vermute ein Problem mit Rekursion über __index und habe mal die Ausgabe verbessert: http://http://b0bby.tk/downloads/LuaDebugger_v0.2.2.exe

edit: "Den Debugger draufhaben": also der Debugger ändert nichts, und wird nur aktiv wenn Siedler per Klick auf den Button im LuaDebugger gestartet wird. Wird Siedler auf die herkömmliche Weise gestartet, kann der Debugger keinen Einfluss haben

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

mcb
#21
10-08-2014 00:44
Posts: 1367

CopyTable ist das hier:

function CopyTable(_t)
	if type(_t) == "table" then
		local r = {};
		for k,v in pairs(_t) do
			r[k] = CopyTable(v);
		end
		return r;
	else
		return _t;
	end
end


aber frag mich nicht, wer die geschrieben hat...

Bei der alten und neuen Version bricht er einfach ab (ohne irgendeine Meldung), das Script zu laden, wenn das metatable gesetzt werden soll.

totalwarANGEL
#22
10-08-2014 01:07
Posts: 2069

Vielleicht akzeptiert der Debug die Table nicht, weil Metatables generell nicht speicherbar sind.

____________________
Liebe ist wie ein Kopfschuss!

yoq
#23
10-08-2014 14:48
Posts: 91

Also ich kann keinen Fehler mit deinem Code finden: http://b0bby.tk/tmp/test_mcb.s5x bei mir funktioniert alles

Einen anderen Bug, der einen Absturz auslösen könnte habe ich jedoch behoben: http://b0bby.tk/downloads/LuaDebugger_v0.2.3.exe

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

yoq
#24
24-08-2014 22:53
Posts: 91

Update: v0.2.4

- Bugs behoben (insbesondere bei S6)
- Die Lua-Skripte sollten nun auch nach dem Laden verfügbar sein, WENN beim Erstellen des Savegames LuaDebugger aktiv war
- Möglichkeit vom Skript aus in die Lua Konsole zu schreiben:

LuaDebugger.Log("accepts any datatype:")
LuaDebugger.Log({ "like", { "this", "nested" }, "table" })



@mcb: könntest du mir eine Map die mit den metatables Probleme macht senden, bei mir traten keine Fehler auf?

____________________
S5 & S6: Lua Script Debugger (Thread) | bbaTool
S5: S5Hook (Thread) | S5 GUI Editor | S5 Grafikupgrade + nVidia fix | Win10 Creators Update

mcb
#25
25-08-2014 19:57
Posts: 1367

Ich bin endlich dazu gekommen, den Fehler zu suchen. Wie es aussieht tatsächlich mein Script den Fehler verursacht. Im Hauptscript (außerhalb von Funktionen) steht sinngemäß sowas:

foo()

function foo()
   
end


Seltsamerweise ergibt das keine Fehlermeldung, weder bei -debugscript noch bei dem neuen Debugger...

Pages: 1 2 3 Next page

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum