2011-12-07 13 views
11

Mi empresa tiene un programa que utiliza Lua incrustado en su tiempo de ejecución, cargando .lua archivos del disco y ejecutando las funciones definidas en ellos repetidas veces.Depurador Lua que se puede conectar al proceso

¿Hay alguna manera de adjuntar al proceso en ejecución y establecer puntos de interrupción en mis archivos .lua? (lo aceptaría, ya sea de estilo GDB depuración de línea de comandos como parte de la distribución Lua, o tal vez un IDE de terceros que proporciona puntos de interrupción interfaz gráfica de usuario de Visual Studio-parecidos.)

O es lo que soy preguntando por completamente absurdo e imposible dada la naturaleza del tiempo de ejecución cargando archivos aleatorios desde el disco?

Editar: Parece que no es sin sentido, teniendo en cuenta que la función propia de Lua debug.getinfo() puede determinar el archivo de origen de una función dada, y debug.sethook() permite una devolución de llamada para cada nueva línea de código introducido. Por lo tanto, es razonable cargar el código fuente del disco y poder saber cuándo el intérprete está ejecutando una determinada línea de código desde ese archivo. La pregunta sigue siendo: ¿cómo me aferro a un proceso existente que tiene un intérprete de Lua e inyecto mi propia función de rastreo (que luego puede ver los pares de números de archivo/línea y pausar la ejecución)?

Respuesta

4

Esta es una alternativa que uso después de mucha búsqueda. Si tienes un ejecutable externo que carga lua, lo hice funcionar en unos minutos. La operación es muy sensible, tiene un depurador interactivo que carga tu código y puedes colocar puntos de depuración de manera interactiva. No tiene un editor, pero utilizo el editor scite o crimson y el ejecutable, una línea en su módulo lua principal habilita el depurador.

http://www.cushy-code.com/grld/ - este enlace parece muerto

me he movido a eclipse.org/ldt tiene un IDE y el depurador integrado, recomendado

hth

+0

Me he mudado a http://www.eclipse.org/koneki/ldt/ tiene un ide y depurador integrado, recomendado – daven11

+0

El enlace de arriba está muerto. –

9

Si usted puede modificar los archivos .lua, puede insertar la siguiente llamada justo antes de que cualquier cosa que necesite depurar:

require 'remdebug.engine'.start() 

Arranca el motor depurador RemDebug Lua e intenta conectarse a un controlador. Si no se puede conectar, continuará funcionando normalmente. Hice some fixes para el motor de depuración, como el manejo de variables temporales, y mi estudiante está trabajando en una GUI del depurador (que se debe entregar el próximo año).

Mientras tanto, puede probar si Lua Development Tools es adecuado para usted. Cuenta con un debugger similar a RemDebug, que debería ser posible establecer la siguiente manera:

require("debugger")(host, port, idekey) 

Como alternativa, puede utilizar SciTE-debug, que es una extensión para el editor SciTE, y puede servir como un controlador para RemDebug. Sólo asegúrese de insertar la llamada a remdebug.engine.start en algún lugar de su código Lua e insertar esto en la ventana de salida SciTE:

:debug.target=remote.lua 

Cuando se inicia el programa, SciTE debería mostrar la fuente y la línea actual.

5

He estado usando Decoda editor para eso.Le permite conectarse a una aplicación C++ en ejecución, luego de eso detecta que está ejecutando un intérprete Lua dentro de su código C++ y muestra su código fuente Lua, donde puede agregar puntos pico e inspeccionar las variables como de costumbre.

1

Probablemente deberías usar Decoda.
Vaya a Debug -> Processes -> Attach para adjuntar su proceso. Esto debería funcionar bien.

2

El Lua plugin for IntelliJ tiene un depurador que funciona sin necesidad de una configuración especial que no sea señalar su intérprete Lua.

Aquí hay un screencast de ella:

http://www.screencast.com/t/CBWIkoZPg

+1

Puedo depurar cosas simples de esta manera, pero no puedo resolver cómo depurar las pruebas unitarias "reventadas". ¿Algun consejo? –

3

forma similar a lo descrito Michal Kottman, he implementado un depurador basado en RemDebug, pero con correcciones y características adicionales (en github: https://github.com/pkulchenko/MobDebug).

Puede actualizar su archivo .lua con require("mobdebug").start("localhost", 8171) en el punto donde desea que se inicie la depuración. A continuación, puede usar el depurador de línea de comandos para ejecutar comandos, establecer puntos de interrupción, evaluar/ejecutar expresiones, etc.

Como alternativa, puede usar ZeroBrane Studio IDE, que se integra con el depurador y le proporciona una interfaz para cargar su código y ejecutar los mismos comandos de depuración en una buena GUI. Si quiere ver el IDE en acción, tengo una demostración simple aquí: http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style.

-1

Bueno, la forma más fácil es esto, gracias al autor genio https://github.com/slembcke/debugger.lua

que no es necesario configurar un servidor de depuración remota, sólo requieren un archivo y dbg llamada simplely() y va a hacer una pausa, al igual que gdb

un tutorial también se envía con él, échale un vistazo.

Cuestiones relacionadas