Отладка в ZeroBrane Studio

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Отладка в ZeroBrane Studio

Post by John Doe »

Как запустить отладку с использованием ZeroBrane Studio

Требуется:
- FAR 3 build 3805 или новее
- ZeroBrane Studio v0.40 или новее

Пошаговая инструкция:
  1. Установить (или просто распаковать) ZeroBrane Studio
    Удобно сразу же изменить некоторые опции, для этого в папке cfg надо создать файл user.lua следующего содержания:

    Code: Select all

    editor.autoactivate = true
    debugger.runonstart = true
    
  2. Запустить ZeroBrane Studio, и осуществить в IDE следующие действия:
    1. Выбрать папку проекта (в левой панели, кнопка с троеточием).
      Если предполагается отладка только пользовательских скриптов и модулей, то нужно выбрать %FARPROFILE%\Macros\
      Если в том числе требуется отладка и плагина LuaMacro, то надо выбрать общий корень (это может быть или %FARHOME%, или корень диска)
    2. Выбрать скрипт в проекте и открыть его. Скрипт любой, необязательно именно тот, который требует отладки.
    3. Запустить сервер отладки: в меню Project пункт Start Debugger Server
  3. Подключить в фаре модули mobdebug и luasocket.
    Достаточно скопировать в %FARPROFILE%\Macros\modules следующие файлы/папки из места где установлен ZeroBrane Studio:

    Code: Select all

    lualibs\mobdebug\mobdebug.lua
    lualibs\socket.lua
    lualibs\socket\
    bin\clibs\socket\
    
  4. Перед отладкой необходимо выполнить следующие команды:

    Code: Select all

    require"mobdebug".coro()
    os.exit = function() require"mobdebug".done() end
    package.nounload.mobdebug = true
    Это удобно делать в каком-либо скрипте, загружаемом при старте фара, например в %FARPROFILE%\Macros\scripts\_macroinit.lua
  5. Для запуска отладки: достаточно из любого скрипта вызвать require"mobdebug".start()
    Это можно сделать сразу в _macroinit.lua, или же вызывать макросом.
    В момент вызова require"mobdebug".start() в IDE должен быть открыт какой-либо скрипт (2b), и сервер отладки (2c) уже должен быть запущен.
Вместо пунктов 4 и 5 можно использовать готовый набор макросов для управления отладкой прямо из фара
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Lua debugger

Post by Shmuel »

paulclinger wrote:
Shmuel wrote:
HaRT wrote:И попутно: есть ли сейчас возможность прицепиться к Lua-макросу, выполняющемуся в ФАРе, внешним отладчиком для Lua?
Если нет, насколько сложно добавить?
Думаю, что такая возможность есть. Надо только найти время.
Желающим попробовать советую в первую очередь ознакомиться с программой ZeroBrane Studio, имеющей remote debugger.
Hi Shmuel,

Должно быть просто попробовать. Я поместил инструкции как запустить удаленную отладку здесь: http://studio.zerobrane.com/doc-remote-debugging.html

Вкратце, надо запустить FAR с нужными переменными окружения, так что отладчик будет видеть luasocket и mobdebug модули который включены в состав ZeroBrane Studio. А потом добавить в код скрипта "require('mobdebug').start()". Пишите если получится или если какие проблемы.
Спасибо, вроде начало получаться. От вопросов пока воздержусь, нужно собрать больше информации, и попробовать сначала разобраться самому. Так что вопросы могут появиться через день-два. :)
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

Re: Lua debugger

Post by paulclinger »

Ну здОрово. Когда будут вопросы, пиши.

Павел.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Lua debugger

Post by Shmuel »

Вот пока такие вопросы:

1. Точки останова работают в файле luamacro.lua, в который я поставил require('mobdebug').start(), но не работают в макросах.
2. Во время сессии отладки нельзя установить или убрать точку останова.
3. Завершение сессии отладки приводит к завершению Фара.
4. Функция print переопределена плагином LuaMacro. Вызов её из отладчика приводит к ошибке.

Вполне возможно, что я что-то делаю не так, как надо.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

Re: Lua debugger

Post by paulclinger »

> 1. Точки останова работают в файле luamacro.lua, в который я поставил require('mobdebug').start(), но не работают в макросах.

Это должно помочь: http://studio.zerobrane.com/doc-faq.htm ... some_cases

> 2. Во время сессии отладки нельзя установить или убрать точку останова.

Да, нужно чтобы приложение было остановлено чтобы поставить/удалить точку останова. Можно использовать "Project | Break".

> 3. Завершение сессии отладки приводит к завершению Фара.

Завершение сесси вызывает os.exit() чтобы чисто завершить приложение. Можешь заменить на пустую функцию: "os.exit = function() end" где-нибудь в скрипте.

> 4. Функция print переопределена плагином LuaMacro. Вызов её из отладчика приводит к ошибке.

Вызов где? В удаленной консоли (Remote console)? Если так, можно не вызывать, поскольку удаленная консоль и так покажет все значения переменных и выражений.

А какая ошибка?

Paul.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Re: Lua debugger

Post by HaRT »

paulclinger wrote:> 3. Завершение сессии отладки приводит к завершению Фара.
Завершение сесси вызывает os.exit() чтобы чисто завершить приложение. Можешь заменить на пустую функцию: "os.exit = function() end" где-нибудь в скрипте.
А нет ли в том отладчике какого-то аналога команды Detach, чтобы отладка прекратилась, а скрипт пошёл дальше?
Фар есть инструмент, а не нянька. © 2009 DrKnS
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

Re: Lua debugger

Post by paulclinger »

HaRT wrote:
paulclinger wrote:> 3. Завершение сессии отладки приводит к завершению Фара.
Завершение сесси вызывает os.exit() чтобы чисто завершить приложение. Можешь заменить на пустую функцию: "os.exit = function() end" где-нибудь в скрипте.
А нет ли в том отладчике какого-то аналога команды Detach, чтобы отладка прекратилась, а скрипт пошёл дальше?
This is interesting idea; there is done() call that will close the socket and completes the debugging, but the script will continue. So, technically, you can try:

os.exit = function() require("mobdebug").done() end

You can also add require("mobdebug").off() to your script, which will turn the debugging off (although the IDE will still "think" it controls the process as the communication socket stays open, so it's different from the first method).
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

Re: Lua debugger

Post by paulclinger »

Извиняюсь, машинально переключился на английский...
gotar
Posts: 412
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 17 times
Been thanked: 3 times

Re: Lua debugger

Post by gotar »

Здесь читает по английски абсолютное большинство
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Re: Lua debugger

Post by HaRT »

paulclinger wrote:добавить в код скрипта "require('mobdebug').start()".
paulclinger wrote:This is interesting idea; there is done() call that will close the socket and completes the debugging, but the script will continue. So, technically, you can try:
os.exit = function() require("mobdebug").done() end
You can also add require("mobdebug").off() to your script
Всё это не совсем то, чего хотелось бы.
Предпочтительно отлаживать скрипт, не внося в него специальных изменений. Т.е. прицепляться к нему отладчиком в любой момент — например, когда выполнение чего-то ждёт (скажем, возврата из FAR API), и отцепляться тоже в произвольный момент, когда дальнейшей необходимости в отладке уже нет. Во всяком случае, именно такова схема, привычная многим разработчикам нативного ПО.
И если дополнение в скрипт, которое включит саму возможность отладки, ещё хоть как-то оправдано, то необходимость добавления кода, чтобы отладку закончить, — это костыль, который даже не вполне понятно, как и осуществить-то без жутких вывертов.
Что в этом плане предлагают современные отладчики, понимающие Lua?
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Lua debugger

Post by Shmuel »

Shmuel wrote: 1. Точки останова работают в файле luamacro.lua, в который я поставил require('mobdebug').start(), но не работают в макросах.
Уже работают. Будем двигаться дальше.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

Re: Lua debugger

Post by paulclinger »

HaRT wrote:Всё это не совсем то, чего хотелось бы.
Предпочтительно отлаживать скрипт, не внося в него специальных изменений. Т.е. прицепляться к нему отладчиком в любой момент — например, когда выполнение чего-то ждёт (скажем, возврата из FAR API), и отцепляться тоже в произвольный момент, когда дальнейшей необходимости в отладке уже нет. Во всяком случае, именно такова схема, привычная многим разработчикам нативного ПО.
Я согласен, вариант не идеальный, но он предоставляет наибольшую гибкость в плане того где и на каких платформах могут быть запущены IDE и отлаживаемое приложение.

Из тех отладчиков которые могут подключаться к процессы с видел только Decoda, так что может стоит попробовать, но тут я помочь не могу.

ZeroBraneStudio (и MobDebug, это отладчик интегрированный в ZBS) используют только средства предоставляемые Lua интерпретатором, так что подключиться к запущенному процессу они не могут, но будут работать везде где запускается Lua (и есть поддержка luasocket). Это позволяет поддерживать отладку Lua 5.1, Lua 5.2, и LuaJIT приложений из одной среды, что мало кто может предоставить.
HaRT wrote:И если дополнение в скрипт, которое включит саму возможность отладки, ещё хоть как-то оправдано, то необходимость добавления кода, чтобы отладку закончить, — это костыль, который даже не вполне понятно, как и осуществить-то без жутких вывертов.
Согласен. Нужно учитывать что изначально отладчик и среда писались для отладки самостоятельных Lua приложений, которые не требуют всех этих дополнительных возможностей (как например продолжение выполнения после завершения отладки). Потом возможности были расширены (например done() метод был добавлен совсем недавно, тоже по просьбе пользователей). В смысле того как это может быть сделано, то код впролне короткий (не тестировано но должно работать):

if require("mobdebug").start() then os.exit = function() require("mobdebug").done() end end

Если ZBS IDE не запущен и отладчик не может к нему подсоединиться, то start() вернет nil и выполнение будет продолжено без отладчика.

У меня уже был похожий запрос от пользователя который хотел отлаживать Lua скрипты запускаемые как часть большого приложения (которое было запущено до и после отладки). Обсуждение здесь, если нитересно: https://github.com/pkulchenko/ZeroBrane ... issues/100; способ мы нашли, хотя и достаточно специфичный.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Lua debugger

Post by John Doe »

Shmuel wrote:
Shmuel wrote: 1. Точки останова работают в файле luamacro.lua, в который я поставил require('mobdebug').start(), но не работают в макросах.
Уже работают. Будем двигаться дальше.
Пытаюсь разобраться. Точки останова в обработчиках событий работают, а в макросах нет.
Почитал faq, добавил вызов require('mobdebug').coro(). Не помогло.

В чём может быть проблема?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Отладка в ZeroBrane Studio

Post by Shmuel »

Попробуйте require("mobdebug").on().
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Отладка в ZeroBrane Studio

Post by John Doe »

Пробовал (в action и других местах)
Не помогает.
Post Reply

Return to “Обсуждение макросов”