2009-04-23 5 views
27

¿Cómo se depura el código lua incrustado en una aplicación de C++?Depuración incrustada Lua

Según tengo entendido, o bien necesito comprar un IDE especial y un enlace en su tiempo de ejecución de lua especial (ugh). O necesito crear una consola de depuración en el motor del juego, usando las llamadas lua debug API.

Me inclino por escribir mi propia consola de depuración, pero parece mucho trabajo. Es hora de que pueda pasar mejor puliendo las otras partes del juego.

Respuesta

10

Existen varias herramientas flotando que pueden hacer al menos partes de lo que desea. He visto referencias a un plugin de VS, hay una extensión de depurador de SciTE en Lua para Windows, y está el proyecto de Kepler RemDebug, así como su LuaEclipse.

RemDebug puede estar en la pista de lo que necesita, ya que fue creado para permitir la depuración de scripts CGI escritos en Lua. Requiere acceso al módulo LuaSocket para proporcionar un canal de comunicaciones entre el script de destino y un controlador, así como un par de otros módulos.

Un problema mayor podría ser la capacidad de cargar módulos arbitrarios desde cualquier entorno limitado que el motor del juego haya puesto alrededor de sus scripts. Si tienes cierto control sobre el motor, entonces ese no será un gran problema.

Esto no es posible actualmente para los desarrolladores de los complementos de Adobe Lightroom, por ejemplo, porque Lightroom no expone require dentro del entorno limitado del complemento.

Una sorpresa para mí ha sido lo raramente que he sentido la necesidad de un depurador cuando trabajo con Lua. He creado varias aplicaciones pequeñas para varios proyectos y me ha sorprendido lo bien que una combinación de backtraces completos de la pila y la llamada ocasional print funciona para localizar los errores que require "strict" no impidieron en primer lugar.

+0

El RemDebugger es casi exactamente lo que estaba buscando. Debería ser útil tal como está, y darme una buena base para personalizar. –

0

Si está usando Windows y VS - ¿Puede usar el truco que usamos?

Copie el código lua en un archivo. Luego, en el código lua, realice una llamada a la API del depurador (en C++ esto es DebuggerBreak(), creo - vea here). luego, cuando se ejecuta el código lua, se iniciará el depurador y podrá especificar el archivo. Entonces depurar como es normal?

+1

Eso soluciona la mitad del problema. Lo que realmente me gustaría hacer es ejecutar el código lua línea por línea. Si entiendo su solución, podré romper en cualquier línea del script lua, pero estaré en el depurador de C++. ¿Cómo inspeccionaría las variables de lua locales y demás? –

+0

Veo esto como un problema en dos partes: una es una inspección fácil que sería difícil ya que estaría escribiendo extensiones de depurador para hacer esto. La segunda forma sería determinar cómo el 'motor' lua almacena estos valores e inspeccionarlos manualmente o mediante macro quizás. –

2

No veo cómo debería funcionar la llamada a DebuggerBreak, ya que es específico de .NET. Supongo que solo funciona con el Lua bifurcado que apunta al CLR.

Si está utilizando Lua estándar tiene algunas instalaciones de depuración ruderadas a través de la función lua llamada debug.debug(). Eso lanzará Lua a tu consola, por lo que si ejecutas lua desde una consola, deberías poder emitir comandos lua interactivamente para inspeccionar tu estado actual. debug.debug() no te pondrá en el marco de pila actual, por lo que debes usar debug.getlocal() para leer los valores de tus variables.

Aún no lo he probado, pero en realidad no creo que crear su propia consola de depuración funcione es mucho trabajo. Recuerde Lua no es un lenguaje tan complicado como C++, por lo que hacer esto es mucho más fácil que hacer un depurador de C++ real como decir gdb.

Creo que hay muchas personas que ya han hecho cosas similares, cuyo código se puede ver. Here es un depurador CLI escrito solo en lua. Solo un archivo lua. No debería ser de uso difícil y modificar para sus necesidades.

6

¿Qué tal Decoda ?? hay un video que explica cómo usarlo, y funciona bastante bien para la fuente embebida lua. (soy un cliente feliz) y es bastante barato.

+0

Uso Decoda y también estoy muy contento con él. Se conecta perfectamente con su proyecto y no requiere configuración alguna. Incluso puedes depurar Lua con Decoda y C++ con otro depurador al mismo tiempo. Mi única queja es que los desarrolladores (Unknown Worlds) tienen un proyecto de mayor prioridad en sus manos (Natural Selection 2), por lo que mis solicitudes de soporte no han recibido respuesta. (Resulta que mi problema no fue culpa de Decoda de todos modos). Además, la lista del proyecto no admite una vista en árbol, por lo que una vez que obtenga muchos archivos, puede convertirse en una larga lista. – Raptormeat

2

Puede usar mi depurador: GRLD (depurador lua remoto gráfico). Al igual que RemDebug, utiliza una conexión de socket, pero a diferencia de RemDebug tiene una bonita interfaz gráfica. Se proporciona el código fuente, por lo que puede hacerlo funcionar en cualquier plataforma. Funciona con el tiempo de ejecución lua estándar. Gratis para uso no comercial.

EDIT: lo siento, tuve que cerrar el sitio web, por lo que el software ya no está disponible para su descarga. Podría publicarlo como software de código abierto más adelante, si alguna vez encuentro el momento.

EDIT 2: enlace actualizado, ahora alojado en GitHub bajo la licencia MIT (open source)

2

No es necesario para escribir su propia consola como es posible que desee comenzar con uno de los ya existentes. RemDebug ya ha sido sugerido; He estado desarrollando MobDebug, que es un depurador basado en RemDebug, pero con una serie de nuevas características y correcciones de errores. La lista detallada de los cambios se encuentra en el README.

Habilitar la depuración en el script puede ser tan simple como agregar require('mobdebug').start() (si está ejecutando su aplicación y el servidor del depurador en el mismo equipo). Esto debería intentar conectarse al depurador que escucha en un puerto predeterminado en localhost. Puede usar una interfaz de línea de comandos incluida en MobDebug, o puede usar un ZeroBrane Studio, que es un IDE Lua que se integra con MobDebug para proporcionar capacidades de depuración. El IDE admite la depuración de Love2d, Moai y otros motores Lua, y también puede funcionar para su configuración.