Отладчик Lua, который может подключаться к процессу

В моей компании есть программа, которая использует Lua, встроенную в ее среду выполнения, загружая файлы .lua с диска и выполняя определенные в них функции повторно.

Есть ли способ подключиться к выполняемому процессу и установить точки останова в моих файлах .lua? (Я бы принял либо отладку командной строки в стиле gdb как часть дистрибутива Lua, либо, возможно, стороннюю среду IDE, которая обеспечивает точки доступа с графическим интерфейсом, подобные Visual Studio).

Или это то, что я прошу абсолютно бессмысленно и невозможно, учитывая природу среды выполнения, загружая случайные файлы с диска?

Изменить. Похоже, это не бессмысленно, учитывая, что функция Lua debug.getinfo() может определять исходный файл для данной функции и debug.sethook() позволяет обратный вызов для каждой введенной новой строки кода. Таким образом, разумно загружать исходный код с диска и быть в состоянии сказать, когда интерпретатор выполняет определенную строку кода из этого файла. Остается вопрос: как я могу запереть существующий процесс с интерпретатором Lua и ввести собственную функцию трассировки (которая затем может наблюдать за парами номеров файлов и строк и приостанавливать выполнение)?

Ответ 1

Это альтернатива, которую я использую после многих поисков. Если у вас есть внешний исполняемый файл, который загружает lua, я заработал это через несколько минут. Операция очень отзывчива, у нее есть интерактивный отладчик, который загружает ваш код, вы можете разместить точки отладки в интерактивном режиме. У него нет редактора, но я использую scite или crimson editor и запускаю исполняемый файл, одна строка в вашем основном модуле lua позволяет отладчику.

http://www.cushy-code.com/grld/ - эта ссылка сейчас кажется мертвой

Я переехал в eclipse.org/ldt, у него есть идеал и встроенный отладчик, рекомендованный

HTH

Ответ 2

Если вы можете изменить файлы .lua, вы можете вставить следующий вызов непосредственно перед тем, что вам нужно отлаживать:

require 'remdebug.engine'.start()

Он запускает RemDebug механизм отладки Lua и пытается подключиться к контроллеру. Если он не может подключиться, он будет продолжать работать как обычно. Я сделал некоторые исправления в движке отладчика, например, занимаюсь временными переменными, а мой ученик работает над графическим интерфейсом отладчика (ожидается в следующем году).

Тем временем вы можете попробовать, если Lua Development Tools работает для вас. Он имеет debugger, подобный RemDebug, который можно настроить следующим образом:

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

В качестве альтернативы вы можете использовать SciTE-debug, который является расширением для редактора SciTE и может служить контроллером для RemDebug. Просто убедитесь, что вы вставляете вызов remdebug.engine.start где-то в свой код Lua и вставляете его в окно вывода SciTE:

:debug.target=remote.lua

Когда вы запускаете свою программу, SciTE должен показывать исходную и текущую строку.

Ответ 3

Я использовал Decoda для этого. Он позволяет подключаться к запущенному С++-приложению, после чего обнаруживает, что вы используете интерпретатор Lua в коде С++ и показываете свой исходный код Lua, где вы можете добавлять beakpoints и проверять переменные как обычно.

Ответ 4

Подобно тому, что описал Михал Коттман, я внедрил отладчик на основе RemDebug, но с дополнительными исправлениями и функциями (на github: https://github.com/pkulchenko/MobDebug).

Вы можете обновить файл .lua с помощью require("mobdebug").start("localhost", 8171) в том месте, где вы хотите начать отладку. Затем вы можете использовать отладчик командной строки для выполнения команд, установки контрольных точек, оценки/выполнения выражений и т.д.

В качестве альтернативы вы можете использовать ZeroBrane Studio IDE, которая интегрируется с отладчиком и дает вам интерфейс для загрузки вашего кода и выполнять те же команды отладчика в приятном графическом интерфейсе. Если вы хотите увидеть IDE в действии, у меня есть простая демонстрация здесь: http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style.

Ответ 6

Вероятно, вы должны использовать Decoda.
Перейдите к Debug -> Processes -> Attach, чтобы прикрепить свой процесс. Это должно работать нормально.

Ответ 7

Ну, проще всего это, благодаря гениальному автору https://github.com/slembcke/debugger.lua

вам не нужно настраивать удаленный сервер отладки, просто требуется один файл и просто вызвать dbg(), и он будет приостановлен, как и gdb

учебник также поставляется вместе с ним, проверьте его.