Latest post of the previous page:
В марте прошлого года у меня это заработало (с помощью Павла). Сейчас надо снова играться, но поскольку срочной необходимости у меня в этом нет, то не уверен, что буду.Отладка в ZeroBrane Studio
-
- Posts: 33
- Joined: Sun 10 Mar, 2013 18:25
Re: Отладка в ZeroBrane Studio
А путь к файлу выглядит правильно (debug.getinfo(1,"S").source)? Должен совпадать с путем к файлу открытом в ZBS, иначе точки останова работать не будут. Может там есть ненормализированные части (../)?John Doe wrote:Пробовал (в action и других местах). Не помогает.
Если ничего не поможет, поскажу где добавить print в отладчике чтобы посмотреть на каком имени точка останова устанавливается и на каком проверяется.
Павел.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
Путь к файлу в порядке, его я проверил сразу (это описано в faq).
Только что попробовал подключить ZBS на другом компьютере, и на этот раз вроде бы получается.
Буду разбираться.
Когда найду наиболее удобный способ использования ZBS с фаром - опишу его здесь.
Только что попробовал подключить ZBS на другом компьютере, и на этот раз вроде бы получается.
Буду разбираться.
Когда найду наиболее удобный способ использования ZBS с фаром - опишу его здесь.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
Предварительный итог: точки останова в макросах не работают, если
Однако проблемы нет, если start вызван из _macroinit.lua или даже из произвольного клавиатурного макроса.
В точке вызова start фокус переключается на ZBS IDE, но в нашем случае это вовсе не та точка, которую мы хотим отлаживать.
Поэтому приходится жать F5, переключиться обратно в фар, и наконец вызывать искомый макрос, в котором у нас уже предварительно назначена точка останова.
Всё это не очень удобно.
Хотелось бы иначе:
- вместо start нужна какая-нибудь команда attach, начинающая отладку но не останавливающая фар
- нужна команда для установки/снятия точек остановки (принимающая параметры "путь к файлу" и "номер строки")
Может быть есть лучший способ отладки. У кого есть на этот счёт мысли - прошу прокомментировать
EDIT:
Первого можно достичь конфигурацией debugger.runonstart = true
Второе тоже есть: команда mobdebug.setbreakpoint/removebreakpoint
(Документация по модулю mobdebug в дистрибутив не входит)
require('mobdebug').start()
вызывать из luamacro.lua.Однако проблемы нет, если start вызван из _macroinit.lua или даже из произвольного клавиатурного макроса.
В точке вызова start фокус переключается на ZBS IDE, но в нашем случае это вовсе не та точка, которую мы хотим отлаживать.
Поэтому приходится жать F5, переключиться обратно в фар, и наконец вызывать искомый макрос, в котором у нас уже предварительно назначена точка останова.
Всё это не очень удобно.
Хотелось бы иначе:
- вместо start нужна какая-нибудь команда attach, начинающая отладку но не останавливающая фар
- нужна команда для установки/снятия точек остановки (принимающая параметры "путь к файлу" и "номер строки")
Может быть есть лучший способ отладки. У кого есть на этот счёт мысли - прошу прокомментировать
EDIT:
Первого можно достичь конфигурацией debugger.runonstart = true
Второе тоже есть: команда mobdebug.setbreakpoint/removebreakpoint
(Документация по модулю mobdebug в дистрибутив не входит)
-
- Posts: 33
- Joined: Sun 10 Mar, 2013 18:25
Re: Отладка в ZeroBrane Studio
> Предварительный итог: точки останова в макросах не работают, если 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е, поскольку сам его использую каждый день.
> Однако проблемы нет, если 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е, поскольку сам его использую каждый день.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
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).
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
P.S.
Может быть мои опасения преувеличены, и переопределённым coroutine.create можно пользоваться всегда.
Но даже в этом случае модификация luamacro.lua нежелательна, в частности потому что с каждой новой версией плагина все изменения туда придётся вносить заново.
Я думал о другом варианте: добраться до coroutine.create как upvalue функции MacroInit (определена в luamacro.lua).
Однако из пользовательского скрипта это можно только используя debug.sethook, а это уже слишком.
Возможно автор LuaMacro согласится внести какие-то изменения, облегчающие задачу.
Может быть мои опасения преувеличены, и переопределённым coroutine.create можно пользоваться всегда.
Но даже в этом случае модификация luamacro.lua нежелательна, в частности потому что с каждой новой версией плагина все изменения туда придётся вносить заново.
Я думал о другом варианте: добраться до coroutine.create как upvalue функции MacroInit (определена в luamacro.lua).
Однако из пользовательского скрипта это можно только используя debug.sethook, а это уже слишком.
Возможно автор LuaMacro согласится внести какие-то изменения, облегчающие задачу.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
Нашёл альтернативный вариант: переопределить загрузчик макросов и в нём делать так:
Официальная возможность переопределение загрузчика пока не предусмотрена, обсуждалось тут.
Code: Select all
if __debug then
local mobdebug = require"mobdebug"
local action = m.action
m.action = function(...) mobdebug.on(); action(...) end
end
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
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/done), включена/выключена (on/off) - Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint?
Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true - Функцию has_breakpoint хотелось бы иметь публичной.
- Разбирая случай, в котором не срабатывают точки останова я обнаружил что в debug.getinfo(1,"S").source путь к файлу содержит префикс
@\\?\
Похоже такая возможность не учитывается
-
- Posts: 33
- Joined: Sun 10 Mar, 2013 18:25
Re: Отладка в ZeroBrane Studio
> Была бы удобна команда соответствующая функции 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').
Павел.
Это интересная идея. Вроде как 'остановить здесь'. Надо подумать как реализовать.
> Если в 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').
Павел.
-
- Posts: 33
- Joined: Sun 10 Mar, 2013 18:25
Re: Отладка в ZeroBrane Studio
> Значение coroutine.create запоминается в luamacro.lua, а значит mobdebug.coro() надо вызывать там, в начале файла.
> Но, насколько я понимаю, нежелательно переопределять coroutine.create навсегда, ведь это нужно только для отладки.
> А модифицировать luamacro.lua каждый раз когда мы захотим начать/завершить отладку это по меньшей мере неудобно, и после этого требуется перегрузить фар (или плагин LuaMacro).
Согласен. Алтернативный вариант с переопределением загрузчика макросов выглядит интересно, но может просто убрать локализацию coroutine.create в LuaMacro? Я не думаю что это дает значительный выигрыш в производительности, а все эти сложности отпадут.
> Но, насколько я понимаю, нежелательно переопределять coroutine.create навсегда, ведь это нужно только для отладки.
> А модифицировать luamacro.lua каждый раз когда мы захотим начать/завершить отладку это по меньшей мере неудобно, и после этого требуется перегрузить фар (или плагин LuaMacro).
Согласен. Алтернативный вариант с переопределением загрузчика макросов выглядит интересно, но может просто убрать локализацию coroutine.create в LuaMacro? Я не думаю что это дает значительный выигрыш в производительности, а все эти сложности отпадут.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
Подумалось что вместо опцииpaulclinger wrote:Это интересная идея. Вроде как 'остановить здесь'. Надо подумать как реализовать.Была бы удобна команда соответствующая функции IDE ShiftF9 - Break execution at the next executed line of code
debugger.runonstart
можно будет просто использовать 2 различные команды.Вот именно: хочется избежать этой ошибки, и не пытаться начинать отладку если дебуггер занят.paulclinger wrote:Как избежать в каком смысле? если отладка вызвана из того же процесса, то start() не должен ничего делать. Если вызвана из другого процесса, то IDE не поддерживает одновременную отладку и второй процесс получит это ошибку.Если в IDE уже идёт отладка, то функция start может вернуть true, но вслед за этим moddebug выдаст ошибку о неожиданном завершении сессии (в IDE в этот момент "Refused a request to start a new debugging session as there is one in progress already.") Можно ли этого как-то избежать?
2 варианта:
- возвращаться из start только после того как отладчик подтвердит готовность (соответственно процесс получит false и сможет его обработать)
- посредством отдельной команды дать возможность процессу узнать о состоянии отладчика
Один из примеров выше.paulclinger wrote:Наверное можно добавить метод, а как его использовать? Можно примеры?Хотелось бы иметь возможность получить текущее состояние отладки:
- сервер запущен/остановлен
- отладка запущена/остановлена (start/done), включена/выключена (on/off)
И ещё одно применение: хочу в процессе реализовать toggle по шорткату, т.е. если отладка запущена, то остановить. Аналогично с on/off
Ок, сейчас попробую. Но в любом случае пожелание: IDE лучше знает где корень проекта, и легко может его "выкусить".paulclinger wrote:Попробуй путь относительно project directory. Отладчик использует относительные пути.Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint? Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true
Хочу реализовать toggle breakpoint, как в IDE. Да, можно вести параллельный учёт точек, но это не очень правильно, ведь точки могут быть изменены и в IDE/paulclinger wrote:А как ее использовать. Обычно тот кто ставит точки останова, знает где они стоят ;)Функцию has_breakpoint хотелось бы иметь публичной.
Обpaulclinger wrote:Не учитывается, это точно. А что за путь-то такой странный? Мне бы не хотелось добавлять обработку для странных путей. Есть идеи откуда он берется? Обычно этот путь устанавливается или самим Lua интерпретатором, или при загрузке Lua кода, например: loadstring(mycode, '@filename').Разбирая случай, в котором не срабатывают точки останова я обнаружил что в debug.getinfo(1,"S").source путь к файлу содержит префикс @\\?\ Похоже такая возможность не учитывается.
\\?\
можно почитать например здесь.По простому: использование этого префикса даёт фару возможность работать с длинными и прочими хитрыми путями.
В данном случае именно такой путь передаётся фаром в имени файла в loadfile.
-
- Posts: 6836
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Отладка в ZeroBrane Studio
Убрать локализацию только с coroutine.create или с других coroutine.xxx тоже?paulclinger wrote:Алтернативный вариант с переопределением загрузчика макросов выглядит интересно, но может просто убрать локализацию coroutine.create в LuaMacro? Я не думаю что это дает значительный выигрыш в производительности, а все эти сложности отпадут.
-
- Posts: 33
- Joined: Sun 10 Mar, 2013 18:25
Re: Отладка в ZeroBrane Studio
Только с coroutine.create.Shmuel wrote:Убрать локализацию только с coroutine.create или с других coroutine.xxx тоже?
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Отладка в ZeroBrane Studio
Получилось примерно так:paulclinger wrote:Попробуй путь относительно project directory. Отладчик использует относительные пути.Можно ли подхватить в IDE точки, установленные с помощью setbreakpoint? Мне не удалось её использовать, установленные точки не срабатывают. Файл задаю полным путём, и has_breakpoint возвращает true
local name = Editor.FileName:lower():gsub(projectroot,""):gsub("\\","/")
Всё работает, в IDE останавливается где положено.
Однако визуально изменения не отображаются, т.е. новые точки не отображаются, а старые не убираются.