2009-04-23 9 views
27

Comment déboguer le code lua intégré dans une application C++? D'après ce que je comprends, soit j'ai besoin d'acheter un IDE spécial et un lien dans leur exécution spéciale lua (pouah). Ou j'ai besoin de construire une console de débogage dans le moteur de jeu, en utilisant les appels lua debug API. Je penche pour l'écriture de ma propre console de débogage, mais cela me semble être un travail de longue haleine. Temps que je pourrais mieux passer à polir les autres parties du jeu.Débogage intégré Lua

Répondre

10

Il existe plusieurs outils qui peuvent faire au moins partie de ce que vous voulez. J'ai vu des références à un plugin VS, il y a une extension de débogueur SciTE dans Lua pour Windows, et il y a le RemDebug du projet Kepler, ainsi que leur LuaEclipse. RemDebug peut être sur la piste de ce dont vous avez besoin, car il a été construit pour permettre le débogage des scripts CGI écrits en Lua. Il nécessite l'accès au module LuaSocket pour fournir un canal de communication entre le script cible et un contrôleur ainsi que quelques autres modules.

Un plus gros problème pourrait être la possibilité de charger des modules arbitraires à l'intérieur de n'importe quel bac à sable que le moteur de jeu a mis autour de vos scripts. Si vous avez un certain contrôle sur le moteur, ce ne sera pas aussi grave. Par exemple, cela n'est actuellement pas possible pour les développeurs de plug-ins Adobe Lightroom, car Lightroom n'expose pas require à l'intérieur du sandbox du plug-in. Une surprise pour moi a été de savoir à quel point j'ai rarement ressenti le besoin d'un débogueur lorsque je travaillais avec Lua. J'ai construit plusieurs petites applications dedans pour divers projets et ai été étonné à quel point une combinaison des backtraces complets de pile et l'appel occasionnel de print fonctionne pour localiser les bogues que require "strict" n'a pas empêché en premier lieu.

+0

Le RemDebugger est presque exactement ce que je cherchais. Il devrait être utilisable tel quel, et donnez-moi une bonne base pour personnaliser. –

0

Si vous utilisez Windows et VS - Pouvez-vous utiliser l'astuce que nous utilisons?

Copiez le code lua dans un fichier. Puis dans le code lua faire un appel à l'API du débogueur (en C++ c'est DebuggerBreak() je pense - voir here). Ensuite, lorsque le code lua sera exécuté, le débogueur démarrera et vous devriez être capable de spécifier le fichier. Puis déboguer comme d'habitude?

+1

Cela résout la moitié du problème. Ce que j'aimerais vraiment faire, c'est exécuter le code lua ligne par ligne. Si vous comprenez votre solution, je serai capable de casser n'importe quelle ligne dans le script lua, mais je serai dans le débogueur C++. Comment pourrais-je inspecter les variables locales de lua et autres. –

+0

Je vois cela comme un problème en deux parties - l'une est l'inspection facile qui serait difficile que vous écrivez des extensions de débogueur pour ce faire. La deuxième façon serait de déterminer comment le 'moteur' lua stocke ces valeurs et les inspecte soit manuellement, soit par macro peut-être. –

2

Je ne vois pas comment appeler DebuggerBreak devrait fonctionner, car c'est spécifique à .NET. Je suppose que cela ne fonctionne qu'avec le Lua fourchu ciblant le CLR.

Si vous utilisez Lua standard, vous disposez de quelques fonctions de débogage rudimentaires via l'appel de fonction lua debug.debug(). Cela va lancer Lua dans votre console, donc si vous utilisez lua depuis une console, vous devriez pouvoir lancer des commandes lua de façon interactive pour inspecter votre état actuel. debug.debug() ne vous mettra pas dans le cadre de pile actuel, vous devez donc utiliser debug.getlocal() pour lire les valeurs de vos variables.

Je ne l'ai pas encore essayé moi-même, mais je ne pense pas que faire votre propre console de débogage est un vrai travail. Souvenez-vous que Lua n'est pas un langage aussi compliqué que C++, donc c'est beaucoup plus facile que de faire un vrai débogueur C++ comme say gdb.

Je pense qu'il y a beaucoup de gens qui ont déjà fait des choses similaires, que le code que vous pourriez regarder. Here est débogueur CLI écrit en seulement lua. Juste un fichier lua. Ne devrait pas être dur à utiliser et modifier pour vos besoins.

6

Que diriez-vous de Decoda? il y a une vidéo qui explique comment l'utiliser, et ça fonctionne très bien pour la source de lua intégrée. (Je suis un client satisfait). et c'est pas cher.

+0

J'utilise Decoda et j'en suis aussi très content. Il se connecte parfaitement à votre projet et ne nécessite aucune configuration. Vous pouvez même déboguer Lua avec Decoda, et C++ avec un autre débogueur en même temps. Ma seule plainte est que les développeurs (Unknown Worlds) ont un projet de priorité beaucoup plus élevé sur leurs mains (Natural Selection 2), donc mes demandes de support sont restées sans réponse. (Il s'avère que mon problème n'était pas la faute de Decoda de toute façon). En outre, la liste de projets ne prend pas en charge une vue arborescente. Ainsi, une fois que vous obtenez un grand nombre de fichiers, cela peut se transformer en une longue liste. – Raptormeat

2

Vous pouvez utiliser mon débogueur: GRLD (débogueur lua graphique distant). Comme RemDebug, il utilise une connexion socket, mais à la différence de RemDebug il a une belle interface graphique. Le code source est fourni, ainsi vous pouvez le faire fonctionner sur n'importe quelle plate-forme. Cela fonctionne avec l'exécution standard de lua. Gratuit pour un usage non commercial.

EDIT: désolé, j'ai dû fermer le site, donc le logiciel n'est plus disponible en téléchargement. Je pourrais le libérer en tant que logiciel open source plus tard, si jamais je trouve le temps.

EDIT 2: lien mis à jour, maintenant hébergé dans GitHub sous la licence MIT (open source)

2

Vous n'avez pas besoin d'écrire votre propre console que vous pouvez commencer avec l'un des ceux qui existent déjà. RemDebug a déjà été suggéré. J'ai développé MobDebug, qui est un débogueur basé sur RemDebug, mais avec une foule de nouvelles fonctionnalités et corrections de bugs. La liste détaillée des modifications est dans le README.

Activer le débogage dans votre script peut être aussi simple que d'ajouter require('mobdebug').start() (si vous exécutez votre application et le serveur de débogage sur la même machine). Cela devrait essayer de se connecter au débogueur en écoutant un port par défaut sur localhost. Vous pouvez utiliser une interface de ligne de commande incluse dans MobDebug, ou vous pouvez utiliser un ZeroBrane Studio, qui est un IDE Lua qui s'intègre à MobDebug pour fournir des fonctionnalités de débogage. L'EDI supporte le débogage pour les moteurs Love2d, Moai et autres moteurs Lua et pourrait aussi bien fonctionner pour votre installation.