Отладка в ZeroBrane Studio

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

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

Post by John Doe »

Latest post of the previous page:

Пробовал (в action и других местах)
Не помогает.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

В марте прошлого года у меня это заработало (с помощью Павла). Сейчас надо снова играться, но поскольку срочной необходимости у меня в этом нет, то не уверен, что буду.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

John Doe wrote:Пробовал (в action и других местах). Не помогает.
А путь к файлу выглядит правильно (debug.getinfo(1,"S").source)? Должен совпадать с путем к файлу открытом в ZBS, иначе точки останова работать не будут. Может там есть ненормализированные части (../)?

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

Павел.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Путь к файлу в порядке, его я проверил сразу (это описано в faq).

Только что попробовал подключить ZBS на другом компьютере, и на этот раз вроде бы получается.
Буду разбираться.
Когда найду наиболее удобный способ использования ZBS с фаром - опишу его здесь.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Предварительный итог: точки останова в макросах не работают, если require('mobdebug').start() вызывать из luamacro.lua.
Однако проблемы нет, если start вызван из _macroinit.lua или даже из произвольного клавиатурного макроса.

В точке вызова start фокус переключается на ZBS IDE, но в нашем случае это вовсе не та точка, которую мы хотим отлаживать.
Поэтому приходится жать F5, переключиться обратно в фар, и наконец вызывать искомый макрос, в котором у нас уже предварительно назначена точка останова.

Всё это не очень удобно.
Хотелось бы иначе:
- вместо start нужна какая-нибудь команда attach, начинающая отладку но не останавливающая фар
- нужна команда для установки/снятия точек остановки (принимающая параметры "путь к файлу" и "номер строки")
Может быть есть лучший способ отладки. У кого есть на этот счёт мысли - прошу прокомментировать

EDIT:
Первого можно достичь конфигурацией debugger.runonstart = true
Второе тоже есть: команда mobdebug.setbreakpoint/removebreakpoint
(Документация по модулю mobdebug в дистрибутив не входит)
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Предварительный итог: точки останова в макросах не работают, если require('mobdebug').start() вызывать из luamacro.lua.
> Однако проблемы нет, если start вызван из _macroinit.lua или даже из произвольного клавиатурного макроса.

Это интересно; спасибо за информацию. А где находятся эти файлы по отношению к друг другу и к project directory?

> Первого можно достичь конфигурацией debugger.runonstart = true
> Второе тоже есть: команда mobdebug.setbreakpoint/removebreakpoint

Добавил в список вещей осветить в секции по отдладке.

> (Документация по модулю mobdebug в дистрибутив не входит)

В общем-то да. Документацию обновляю по мере возможности/надобности, но дыр еще полно. Если есть еще какие вопросы, спрашивайте. Я поздно заметил это сообщение, а Вы уж со всем и разобрались.

Debugger preferences описаны здесь (http://studio.zerobrane.com/doc-general ... ences.html), разные примеры отладки здесь (http://studio.zerobrane.com/documentation.html); буду рад добавить и описание отладки в FARе, поскольку сам его использую каждый день.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

paulclinger wrote:> Предварительный итог: точки останова в макросах не работают, если require('mobdebug').start() вызывать из luamacro.lua.
> Однако проблемы нет, если start вызван из _macroinit.lua или даже из произвольного клавиатурного макроса.

Это интересно; спасибо за информацию. А где находятся эти файлы по отношению к друг другу и к project directory?


Перепроверил: если start в начале файла, то всё нормально. Проблема только когда start в конце файла.
В любом случае, это неважно, т.к. start всё равно удобнее вызывать позже, макросом.

Пользовательские скрипты (и макросы) можно редактировать и динамически перезагружать не выходя из фара.
Соответственно и всю систему отладки хотелось бы сделать интерактивной, чтобы в процессе использовать не требовалось постоянных изменений в исходном коде.
И почти всё прекрасно делается макросами, за исключением mobdebug.coro.

Значение coroutine.create запоминается в luamacro.lua, а значит mobdebug.coro() надо вызывать там, в начале файла.
Но, насколько я понимаю, нежелательно переопределять coroutine.create навсегда, ведь это нужно только для отладки.
А модифицировать luamacro.lua каждый раз когда мы захотим начать/завершить отладку это по меньшей мере неудобно, и после этого требуется перегрузить фар (или плагин LuaMacro).
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

P.S.
Может быть мои опасения преувеличены, и переопределённым coroutine.create можно пользоваться всегда.
Но даже в этом случае модификация luamacro.lua нежелательна, в частности потому что с каждой новой версией плагина все изменения туда придётся вносить заново.

Я думал о другом варианте: добраться до coroutine.create как upvalue функции MacroInit (определена в luamacro.lua).
Однако из пользовательского скрипта это можно только используя debug.sethook, а это уже слишком.

Возможно автор LuaMacro согласится внести какие-то изменения, облегчающие задачу.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Нашёл альтернативный вариант: переопределить загрузчик макросов и в нём делать так:

Code: Select all

  if __debug then
    local mobdebug = require"mobdebug"
    local action = m.action
    m.action = function(...) mobdebug.on(); action(...) end
  end
Официальная возможность переопределение загрузчика пока не предусмотрена, обсуждалось тут.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

paulclinger
  1. Была бы удобна команда соответствующая функции IDE ShiftF9 - Break execution at the next executed line of code
  2. Если в IDE уже идёт отладка, то функция start может вернуть true, но вслед за этим moddebug выдаст ошибку о неожиданном завершении сессии (в IDE в этот момент "Refused a request to start a new debugging session as there is one in progress already.")
    Можно ли этого как-то избежать?
  3. Хотелось бы иметь возможность получить текущее состояние отладки:
    - сервер запущен/остановлен
    - отладка запущена/остановлена (start/done), включена/выключена (on/off)
  4. Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint?
    Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true
  5. Функцию has_breakpoint хотелось бы иметь публичной.
  6. Разбирая случай, в котором не срабатывают точки останова я обнаружил что в debug.getinfo(1,"S").source путь к файлу содержит префикс @\\?\
    Похоже такая возможность не учитывается
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Была бы удобна команда соответствующая функции IDE ShiftF9 - Break execution at the next executed line of code

Это интересная идея. Вроде как 'остановить здесь'. Надо подумать как реализовать.

> Если в IDE уже идёт отладка, то функция start может вернуть true, но вслед за этим moddebug выдаст ошибку о неожиданном завершении сессии (в IDE в этот момент "Refused a request to start a new debugging session as there is one in progress already.") Можно ли этого как-то избежать?

Как избежать в каком смысле? если отладка вызвана из того же процесса, то start() не должен ничего делать. Если вызвана из другого процесса, то IDE не поддерживает одновременную отладку и второй процесс получит это ошибку.

> Хотелось бы иметь возможность получить текущее состояние отладки:
> - сервер запущен/остановлен
> - отладка запущена/остановлена (start/done), включена/выключена (on/off)

Наверное можно добавить метод, а как его использовать? Можно примеры?

> Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint? Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true

Попробуй путь относительно project directory. Отладчик использует относительные пути.

> Функцию has_breakpoint хотелось бы иметь публичной.

А как ее использовать. Обычно тот кто ставит точки останова, знает где они стоят ;)

> Разбирая случай, в котором не срабатывают точки останова я обнаружил что в debug.getinfo(1,"S").source путь к файлу содержит префикс @\\?\ Похоже такая возможность не учитывается.

Не учитывается, это точно. А что за путь-то такой странный? Мне бы не хотелось добавлять обработку для странных путей. Есть идеи откуда он берется? Обычно этот путь устанавливается или самим Lua интерпретатором, или при загрузке Lua кода, например: loadstring(mycode, '@filename').

Павел.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Значение coroutine.create запоминается в luamacro.lua, а значит mobdebug.coro() надо вызывать там, в начале файла.
> Но, насколько я понимаю, нежелательно переопределять coroutine.create навсегда, ведь это нужно только для отладки.
> А модифицировать luamacro.lua каждый раз когда мы захотим начать/завершить отладку это по меньшей мере неудобно, и после этого требуется перегрузить фар (или плагин LuaMacro).

Согласен. Алтернативный вариант с переопределением загрузчика макросов выглядит интересно, но может просто убрать локализацию coroutine.create в LuaMacro? Я не думаю что это дает значительный выигрыш в производительности, а все эти сложности отпадут.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

paulclinger wrote:
Была бы удобна команда соответствующая функции IDE ShiftF9 - Break execution at the next executed line of code
Это интересная идея. Вроде как 'остановить здесь'. Надо подумать как реализовать.
Подумалось что вместо опции debugger.runonstart можно будет просто использовать 2 различные команды.
paulclinger wrote:
Если в IDE уже идёт отладка, то функция start может вернуть true, но вслед за этим moddebug выдаст ошибку о неожиданном завершении сессии (в IDE в этот момент "Refused a request to start a new debugging session as there is one in progress already.") Можно ли этого как-то избежать?
Как избежать в каком смысле? если отладка вызвана из того же процесса, то start() не должен ничего делать. Если вызвана из другого процесса, то IDE не поддерживает одновременную отладку и второй процесс получит это ошибку.
Вот именно: хочется избежать этой ошибки, и не пытаться начинать отладку если дебуггер занят.
2 варианта:
- возвращаться из start только после того как отладчик подтвердит готовность (соответственно процесс получит false и сможет его обработать)
- посредством отдельной команды дать возможность процессу узнать о состоянии отладчика
paulclinger wrote:
Хотелось бы иметь возможность получить текущее состояние отладки:
- сервер запущен/остановлен
- отладка запущена/остановлена (start/done), включена/выключена (on/off)
Наверное можно добавить метод, а как его использовать? Можно примеры?
Один из примеров выше.
И ещё одно применение: хочу в процессе реализовать toggle по шорткату, т.е. если отладка запущена, то остановить. Аналогично с on/off
paulclinger wrote:
Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint? Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true
Попробуй путь относительно project directory. Отладчик использует относительные пути.
Ок, сейчас попробую. Но в любом случае пожелание: IDE лучше знает где корень проекта, и легко может его "выкусить".
paulclinger wrote:
Функцию has_breakpoint хотелось бы иметь публичной.
А как ее использовать. Обычно тот кто ставит точки останова, знает где они стоят ;)
Хочу реализовать toggle breakpoint, как в IDE. Да, можно вести параллельный учёт точек, но это не очень правильно, ведь точки могут быть изменены и в IDE/
paulclinger wrote:
Разбирая случай, в котором не срабатывают точки останова я обнаружил что в debug.getinfo(1,"S").source путь к файлу содержит префикс @\\?\ Похоже такая возможность не учитывается.
Не учитывается, это точно. А что за путь-то такой странный? Мне бы не хотелось добавлять обработку для странных путей. Есть идеи откуда он берется? Обычно этот путь устанавливается или самим Lua интерпретатором, или при загрузке Lua кода, например: loadstring(mycode, '@filename').
Об \\?\ можно почитать например здесь.
По простому: использование этого префикса даёт фару возможность работать с длинными и прочими хитрыми путями.
В данном случае именно такой путь передаётся фаром в имени файла в loadfile.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

paulclinger wrote:Алтернативный вариант с переопределением загрузчика макросов выглядит интересно, но может просто убрать локализацию coroutine.create в LuaMacro? Я не думаю что это дает значительный выигрыш в производительности, а все эти сложности отпадут.
Убрать локализацию только с coroutine.create или с других coroutine.xxx тоже?
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

Shmuel wrote:Убрать локализацию только с coroutine.create или с других coroutine.xxx тоже?
Только с coroutine.create.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

paulclinger wrote:
Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint? Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true
Попробуй путь относительно project directory. Отладчик использует относительные пути.
Получилось примерно так: local name = Editor.FileName:lower():gsub(projectroot,""):gsub("\\","/")
Всё работает, в IDE останавливается где положено.
Однако визуально изменения не отображаются, т.е. новые точки не отображаются, а старые не убираются.
Post Reply

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