2009-04-23 12 views
27

Wie Debuggen Sie Lua-Code in einer C++ - Anwendung eingebettet?Debugging Embedded Lua

Von dem, was ich sammle, muss ich entweder eine spezielle IDE kaufen und verknüpfen in ihrer speziellen Lua Runtime (UGH). Oder ich muss mit der lua debug API Anrufe eine Debug-Konsole in der Game-Engine erstellen.

Ich lehne meine eigene Debug-Konsole zu schreiben, aber es scheint wie eine Menge Arbeit. Zeit, die ich besser damit verbringen könnte, die anderen Teile des Spiels zu polieren.

Antwort

10

Es gibt mehrere Werkzeuge, die herum schweben, die mindestens Teile von dem tun können, was Sie wollen. Ich habe Referenzen zu einem VS-Plugin gesehen, es gibt eine SciTE-Debugger-Erweiterung in Lua für Windows, und es gibt die RemDebug des Kepler-Projekts sowie deren LuaEclipse.

RemDebug ist möglicherweise auf der Spur von dem, was Sie brauchen, da es zum Debuggen von in Lua geschriebenen CGI-Skripten erstellt wurde. Es erfordert Zugriff auf das LuaSocket-Modul, um einen Kommunikationskanal zwischen dem Zielskript und einem Controller sowie einigen anderen Modulen bereitzustellen.

Ein größeres Problem könnte die Möglichkeit sein, beliebige Module aus einer beliebigen Sandbox zu laden, die die Spielengine um Ihre Skripte gelegt hat. Wenn Sie etwas Kontrolle über den Motor haben, wird das nicht so ein großes Problem sein.

Dies ist derzeit beispielsweise für Entwickler von Adobe Lightroom-Plug-Ins nicht möglich, da Lightroom require nicht innerhalb der Sandbox des Plug-Ins aussetzt.

Eine Überraschung für mich war, wie selten ich bei der Arbeit mit Lua einen Debugger brauchte. Ich habe mehrere kleine Anwendungen für verschiedene Projekte darin erstellt und bin überrascht gewesen, wie gut eine Kombination aus kompletten Stack-Backtraces und dem gelegentlichen print Aufruf funktioniert, um die Fehler zu finden, die require "strict" überhaupt nicht verhindert haben.

+0

Der RemDebugger ist fast genau das, wonach ich gesucht habe. Es sollte benutzbar sein wie es ist, und gibt mir eine gute Basis, um von anzupassen. –

0

Wenn Sie Windows und VS verwenden - Können Sie den Trick verwenden, den wir verwenden?

Kopieren Sie den Lua-Code in eine Datei. Dann in der lua-Code einen Aufruf an den Debugger api (in C++ ist dies DebuggerBreak() Ich denke - siehe here). Wenn der Lua-Code ausgeführt wird, wird der Debugger gestartet und Sie können die Datei angeben. Dann wie üblich debuggen?

+1

Das löst das halbe Problem. Was ich wirklich gerne machen würde ist, den Lua-Code Zeile für Zeile auszuführen. Wenn Sie Ihre Lösung verstehen, kann ich an jeder Zeile im Lua-Skript brechen, aber ich bin im C++ - Debugger. Wie würde ich lokale Lua-Variablen und solche untersuchen? –

+0

Ich sehe das als ein Problem in zwei Teilen - eins ist eine einfache Überprüfung, die schwer wäre, da Sie Debugger-Erweiterungen schreiben würden, um dies zu tun. Der zweite Weg wäre, zu bestimmen, wie die Lua 'Engine' diese Werte speichert und sie entweder manuell oder über Makros prüft. –

2

Ich sehe nicht, wie DebuggerBreak aufrufen sollte, da das .NET-spezifisch ist. Ich würde annehmen, dass das nur mit dem gegabelten Lua funktioniert, der auf die CLR abzielt.

Wenn Sie Standard-Lua verwenden, haben Sie über den lua-Funktionsaufruf debug.debug() einige unübliche Debugging-Möglichkeiten. Dadurch wird Lua in Ihre Konsole geworfen. Wenn Sie also lua von einer Konsole aus ausführen, sollten Sie Lua-Befehle interaktiv ausgeben können, um Ihren aktuellen Status zu überprüfen. debug.debug() wird Sie nicht in den aktuellen Stack-Frame bringen, daher müssen Sie debug.getlocal() verwenden, um die Werte Ihrer Variablen zu lesen.

Ich habe es selbst noch nicht ausprobiert, aber ich glaube nicht, dass das Erstellen einer eigenen funktionsfähigen Debug-Konsole so viel Arbeit ist. Denken Sie daran, dass Lua keine so komplizierte Sprache wie C++ ist, also ist dies viel einfacher als einen echten C++ - Debugger wie zB gdb zu machen.

Ich denke, es gibt eine Menge Leute, die schon ähnliche Dinge gemacht haben, deren Code man sich ansehen könnte. Here ist CLI-Debugger nur in lua geschrieben. Nur eine Lua-Datei. Sollte nicht zu hart zu verwenden und für Ihre Bedürfnisse ändern.

6

Wie wäre es mit Decoda ?? Es gibt ein Video, das erklärt, wie man es benutzt, und es funktioniert ziemlich gut für eingebettete lua-Quelle. (Ich bin ein glücklicher Kunde). und es ist ziemlich billig.

+0

Ich benutze Decoda und bin auch sehr zufrieden damit. Es verbindet sich nahtlos mit Ihrem Projekt und erfordert keinerlei Installation. Sie können sogar Lua mit Decoda und C++ mit einem anderen Debugger gleichzeitig debuggen. Meine einzige Beschwerde ist, dass die Entwickler (Unknown Worlds) ein viel höher priorisiertes Projekt auf ihren Händen haben (Natural Selection 2), so dass meine Supportanfragen unbeantwortet blieben. (Es stellt sich heraus, dass mein Problem nicht Decodes Schuld war). Außerdem unterstützt das Projektverzeichnis keine Baumansicht. Wenn Sie also viele Dateien erhalten haben, kann es zu einer langen Liste werden. – Raptormeat

2

Sie können meinen Debugger verwenden: GRLD (grafische Remote-Lua-Debugger). Wie RemDebug verwendet es eine Socket-Verbindung, aber im Gegensatz zu RemDebug hat es eine nette grafische Oberfläche. Der Quellcode wird bereitgestellt, sodass Sie ihn auf jeder Plattform verwenden können. Es funktioniert mit der Standard-Lua-Laufzeit. Kostenlos für nicht-kommerzielle Nutzung.

EDIT: Entschuldigung, ich musste die Website schließen, damit die Software nicht mehr zum Download bereitsteht. Ich könnte es später als Open-Source-Software veröffentlichen, wenn ich die Zeit finde.

EDIT 2: Link aktualisiert, jetzt in GitHub unter der MIT-Lizenz (Open Source)

gehostet
2

Sie benötigen keine eigene Konsole zu schreiben, wie Sie mit einem der bestehenden starten möchten. RemDebug wurde bereits vorgeschlagen; Ich habe MobDebug entwickelt, einen Debugger, der auf RemDebug basiert, aber mit einer Vielzahl neuer Funktionen und Fehlerbehebungen. Die detaillierte Liste der Änderungen befindet sich in der README.

Das Debugging in Ihrem Skript kann so einfach sein wie das Hinzufügen von require('mobdebug').start() (wenn Sie Ihre App und den Debugger-Server auf demselben Computer ausführen). Dies sollte versuchen, eine Verbindung zum Debugger herzustellen, der auf einem Standardport auf localhost abhört. Sie können eine Befehlszeilenschnittstelle verwenden, die in MobDebug enthalten ist, oder Sie können eine ZeroBrane Studio verwenden, bei der es sich um eine Lua IDE handelt, die in MobDebug integriert ist, um Debugging-Funktionen bereitzustellen. Die IDE unterstützt Debugging für Love2d, Moai und andere Lua-Engines und kann auch gut für das Setup funktionieren.