Отладка в ZeroBrane Studio

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

Отладка в ZeroBrane Studio

Post by John Doe » Sun 10 Mar, 2013 20:59

Как запустить отладку с использованием 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: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: Lua debugger

Post by Shmuel » Sun 10 Mar, 2013 22:32

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 » Sun 10 Mar, 2013 23:42

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

Павел.

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: Lua debugger

Post by Shmuel » Mon 11 Mar, 2013 18:46

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

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 » Mon 11 Mar, 2013 19:34

> 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: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

Re: Lua debugger

Post by HaRT » Mon 11 Mar, 2013 19:51

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 » Mon 11 Mar, 2013 20:55

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 » Mon 11 Mar, 2013 20:55

Извиняюсь, машинально переключился на английский...

gotar
Posts: 293
Joined: Sun 06 Sep, 2009 12:34
Has thanked: 8 times

Re: Lua debugger

Post by gotar » Mon 11 Mar, 2013 22:53

Здесь читает по английски абсолютное большинство

User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

Re: Lua debugger

Post by HaRT » Tue 12 Mar, 2013 08:25

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: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: Lua debugger

Post by Shmuel » Tue 12 Mar, 2013 10:27

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

paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

Re: Lua debugger

Post by paulclinger » Tue 12 Mar, 2013 18:44

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: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Re: Lua debugger

Post by John Doe » Mon 10 Feb, 2014 16:29

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

В чём может быть проблема?

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

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

Post by Shmuel » Mon 10 Feb, 2014 16:39

Попробуйте require("mobdebug").on().

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

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

Post by John Doe » Mon 10 Feb, 2014 17:08

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

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

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

Post by Shmuel » Mon 10 Feb, 2014 18:08

В марте прошлого года у меня это заработало (с помощью Павла). Сейчас надо снова играться, но поскольку срочной необходимости у меня в этом нет, то не уверен, что буду.

Post Reply

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