2009-04-23 1 views
27

Как вы отлаживаете код lua, встроенный в приложение C++?Отладка встроенных Lua

Из того, что я собираю, либо мне нужно купить специальную IDE и ссылку в их специальной среде выполнения lua (тьфу). Или мне нужно создать консоль отладки в игровом движке, используя вызовы lua debug API.

Я склоняюсь к написанию собственной консоли отладки, но это похоже на большую работу. Время, которое я мог бы лучше потратить на полировку других частей игры.

ответ

10

Существует несколько инструментов, плавающих вокруг, которые могут выполнять, по крайней мере, части того, что вы хотите. Я видел ссылки на плагин VS, есть расширение отладчика SciTE в Lua для Windows, и есть проект Kepler RemDebug, а также их LuaEclipse.

RemDebug может быть на пути к тому, что вам нужно, поскольку он был создан для разрешения отладки сценариев CGI, написанных в Lua. Это требует доступа к модулю LuaSocket для обеспечения канала связи между целевым скриптом и контроллером, а также несколькими другими модулями.

Большая проблема может заключаться в возможности загрузить произвольные модули из любой изолированной среды, в которой движок игры помещает ваши скрипты. Если у вас есть некоторый контроль над движком, тогда это не будет проблемой.

В настоящее время это невозможно для разработчиков плагинов Adobe Lightroom, поскольку Lightroom не выставляет require внутри изолированной программной плагины.

Удивительным для меня было то, как редко я чувствовал потребность в отладчике при работе с Lua. Я разработал несколько небольших приложений в нем для различных проектов и был удивлен тем, насколько хорошо сочетаются полные стековые обратные трассы и случайный вызов print, чтобы найти ошибки, которые require "strict" не помешали в первую очередь.

+0

The RemDebugger - это почти то, что я искал. Он должен быть полезен, как есть, и дать мне хорошую базу для настройки. –

0

Если вы используете Windows и VS - можете ли вы использовать трюк, который мы используем?

Скопируйте код lua в файл. Затем в коде lua вызовите Debugger api (в C++ это DebuggerBreak() Я думаю - см. here). тогда, когда код lua выполнит отладчик, он запустится, и вы сможете указать файл. Затем отлаживать как обычно?

+1

Это решает половину проблемы. То, что я действительно хотел бы сделать, это выполнить код lua по строкам. Если вы поймете свое решение, я смогу разбить любую строку в сценарии lua, но я буду в отладчике C++. Как я могу проверить местные переменные lua и т. Д. –

+0

Я рассматриваю это как проблему в двух частях - это простой осмотр, который будет затруднен, поскольку вы будете писать расширения отладчика, чтобы это сделать. Второй способ - определить, как lua ​​'engine' сохраняет эти значения и проверяет их как вручную, так и через макрос. –

2

Я не вижу, как следует работать с DebuggerBreak, поскольку это специфично для .NET. Я бы предположил, что работает только с разветвленной Lua, нацеленной на CLR.

Если вы используете стандартный Lua, у вас есть некоторые способы отладки с помощью функции lua функции debug.debug(). Это запустит Lua в вашу консоль, поэтому, если вы запускаете lua с консоли, вы должны в интерактивном режиме вывести команды lua для проверки вашего текущего состояния. debug.debug() не помещает вас в текущий стек стека, поэтому вам нужно использовать debug.getlocal() для чтения значений ваших переменных.

Я еще не пробовал это сам, но на самом деле я не думаю, что создание собственной рабочей отладочной консоли - это большая работа. Помните, что Lua - это не такой сложный язык, как C++, поэтому сделать это намного проще, чем сделать настоящий отладчик C++, например say gdb.

Я думаю, что есть много людей, которые уже делали подобные вещи, чей код вы могли бы посмотреть. Here - отладчик CLI, написанный только в lua. Всего один файл lua. Не следует жестко использовать и изменять для ваших нужд.

6

Как насчет Decoda ?? есть видео, в котором объясняется, как его использовать, и он отлично подходит для встроенного источника lua. (я счастливый клиент). и это довольно дешево.

+0

Я использую Decoda, и я тоже очень доволен этим. Он легко соединяется с вашим проектом и не требует никакой настройки. Вы можете даже отлаживать Lua с Decoda, а C++ - с другим отладчиком одновременно. Моя единственная жалоба заключается в том, что разработчики (Unknown Worlds) имеют гораздо более приоритетный проект на своих руках (Natural Selection 2), поэтому мои запросы поддержки остались без ответа. (Оказывается, мой вопрос не был причиной Дедоды). Кроме того, список проектов не поддерживает древовидное представление, поэтому, как только вы получите много файлов, он может превратиться в один длинный список. – Raptormeat

2

Вы можете использовать мой отладчик: GRLD (графический удаленный отладчик lua). Как и RemDebug, он использует соединение сокета, но в отличие от RemDebug имеет приятный графический интерфейс. Исходный код предоставляется, поэтому вы можете заставить его работать на любой платформе. Он работает со стандартным временем выполнения lua. Бесплатно для некоммерческого использования.

EDIT: извините, мне пришлось закрыть сайт, поэтому программное обеспечение недоступно для загрузки. Я мог бы позже опубликовать его как ПО с открытым исходным кодом, если найду время.

EDIT 2: ссылка обновлена, теперь размещается в GitHub под лицензией MIT (с открытым исходным кодом)

2

Вам не нужно писать свою собственную консоль, как вы можете начать с одного из существующих. RemDebug уже был предложен; Я разрабатываю MobDebug, который является отладчиком на основе RemDebug, но с множеством новых функций и исправлений ошибок. Подробный список изменений находится в README.

Включение отладки в вашем скрипте может быть таким же простым, как добавление require('mobdebug').start() (если вы используете приложение и сервер отладчика на том же компьютере). Это должно попытаться подключиться к отладчику, прослушивающему порт по умолчанию на localhost. Вы можете использовать интерфейс командной строки, включенный в MobDebug, или вы можете использовать ZeroBrane Studio, который является Lua IDE, который интегрируется с MobDebug для обеспечения возможностей отладки. IDE поддерживает отладку для движков Love2d, Moai и других Lua и может также работать для вашей настройки.