Отладка в 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:

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

Post by John Doe »

Latest post of the previous page:

Даже основываясь на поведении Lua 5.1/2: можно ведь перехватывать значение thread, и регистрировать новый хук автоматически?
(гипотетически, я конечно не предлагаю переделывывать весь mobdebug)

P.S.
Кстати почему бы coro не переопределять и coroutine.wrap?
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Даже основываясь на поведении Lua 5.1/2: можно ведь перехватывать значение thread, и регистрировать новый хук автоматически? (гипотетически, я конечно не предлагаю переделывывать весь mobdebug)

Можно конечно. Это все результат эволюционного развития: сначала был отладчик который вообще не поддерживал отладку coroutine, потом я добавил on/off для исключения частей кода (в основнов для производительности), потом добавил использование on/off для включения ручной отладки в coroutine, потом добавил coro/moai вызовы для включения отладки в coroutine автоматически и т.д. ;)

Поддержка отладки LuaJIT была добавлена тоже по ходу дела. Основная идея в том что интерфейс отладки тот же самый, независимо от того где запущен скрипт, под Lua или LuaJIT.

> Кстати почему бы coro не переопределять и coroutine.wrap?

Потому что есть части кода в mobdebug которые исполняются в приложении и не должны отлаживаться. А кому надо, тот именно так и добавит ;)
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 »

paulclinger wrote:Потому что есть части кода в mobdebug которые исполняются в приложении и не должны отлаживаться.
Не совсем понимаю как это мешает переопределению coroutine.wrap.
Если mobdebug сам использует coroutine.wrap, то разве не достаточно локализовать coroutine.wrap до переопределения?
paulclinger wrote:А кому надо, тот именно так и добавит ;)
В функция mobdebug.core() мне не нравится то, что она переопределяет глобальную переменную, причём делает это абсолютно неявно (узнать об этом можно только из исходного кода).
Предлагаю вместо этого возвращать изменённую функцию coroutine.create (и заодно и coroutine.wrap)
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Если mobdebug сам использует coroutine.wrap, то разве не достаточно локализовать coroutine.wrap до переопределения?

В общем-то да; наверное так и надо сделать.

> Предлагаю вместо этого возвращать изменённую функцию coroutine.create (и заодно и coroutine.wrap)

Это как? Вот так:
  1. coroutine.create, coroutine.wrap = require('mobdebug').coro()
-- or --
  1. mycreate, mywrap = require('mobdebug').coro()
  2.  
  3. -- and later --
  4.  
  5. mycreate(...)
  6.  
  7. mywrap(...)
?

Можно наверное и так, но идея была в том чтобы делать минимум изменений в скриптах пользователей (только добавить require('mobdebug').start() и require('mobdebug').coro())
Last edited by paulclinger on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: [code2], [c]
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 »

paulclinger wrote:
Предлагаю вместо этого возвращать изменённую функцию coroutine.create (и заодно и coroutine.wrap)
...
Можно наверное и так, но идея была в том чтобы делать минимум изменений в скриптах пользователей (только добавить require('mobdebug').start() и require('mobdebug').coro())
Мне кажется в данном случае это более чем оправданно, т.к. с первого взгляда становится ясно что именно происходит и как этим управлять.

Ещё функция coro может получать параметр, при запуске которого будут возвращаться оригинальные функции.
  1. -- включить отладку в корутинах
  2.  
  3. coroutine.create, coroutine.wrap = require('mobdebug').coro(true)
  4.  
  5. -- выключить отладку в корутинах
  6.  
  7. coroutine.create, coroutine.wrap = require('mobdebug').coro(false)
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 »

Кстати нигде в документации ZBS/mobdebug не акцентируется тот факт, что команды mobdebug.off/on действуют только на текущую корутину.
Мне понадобилось делать это глобально (на прошлой странице долго разбирались).
Себя я конечно всё уже сделал, но считаю что отдельная функция для временного (от/в)ключения отладки в корутинах может быть полезна и другим.

Что если ввести команду типа mobdebug.coroon/off, которая будет управлять внутренним флагом coroIsOn, и соответственно:

Code: Select all

  local function cocreate_dbg (f, ...)
    return cocreate(function(...)
      if coroIsOn then require"mobdebug".on() end
      return f(...)
    end, ...)
  end
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> coroutine.create, coroutine.wrap = require('mobdebug').coro(true)

Это можно сделать. И должно быть совместимо с текущим интерфейсом.

> Что если ввести команду типа mobdebug.coreon/off, которая будес управлять внутренним флагом coroIsOn, и соответственно:

Не получится. В cocreate это поздно проверять, поскольку coroutine уже выполняется. Это надо делать в on/off вызове, но для всех короутин. Может добавить true параметр, который будет сигнализировать что надо off() сделать для всех? on() делать для всех смысла нет, поскольку неизвестно что включать в это "всех".

Или имелось ввиду возможность динамически выключать отладку новых короутин? так это как раз то что я имел ввиду под использованием coroutine.create (modified with debugging) и mycreate (original without debugging).
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 »

paulclinger wrote:Может добавить true параметр, который будет сигнализировать что надо off() сделать для всех?
Это конечно может быть полезно, но мне пока не требовалось.
paulclinger wrote:Или имелось ввиду возможность динамически выключать отладку новых короутин? так это как раз то что я имел ввиду под использованием coroutine.create (modified with debugging) и mycreate (original without debugging).
Да, именно это.
Использовать разные фунции для разных случаев не получится, если корутины создаются в одном месте (в макросистеме фара именно так).

Если предложение по coro с параметром true/false будет реализовано, то станет возможным отключение отладки новых корутин способом, указанном в примере. В общем-то этого более чем достаточно, если только приложение не локализует функции create/wrap.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

Решил обобщить все изменения основываясь на этой дискусии:

- Разбирая случай, в котором не срабатывают точки останова я обнаружил что в debug.getinfo(1,"S").source путь к файлу содержит префикс @\\?\ Похоже такая возможность не учитывается.
http://msdn.microsoft.com/en-us/library ... namespaces
- coro() changes: -- включить отладку в корутинах coroutine.create, coroutine.wrap = require('mobdebug').coro(true); -- выключить отладку в корутинах coroutine.create, coroutine.wrap = require('mobdebug').coro(false)
- добавить DONE команду в отладчик
- курсор не следует за исполняемой в данный момент строкой кода, и для перехода приходится кликать мышью.
- И отдельно удобно иметь команду вернуть каретку к текущей инструкции (часто бывает надо куда-то уйти что-то посмотреть) — Show Next Statement.

- Ошибка при подсчете текущей строки: http://forum.farmanager.com/viewtopic.p ... 45#p116702

это я воспроизвести никак не смог. Можно пример файла на котором это происходило и описание: точный размер окна в строчках, где точка останова и т.д.

- Incorrect activation with [ESC]: http://forum.farmanager.com/viewtopic.p ... 45#p116739

Это я уже исправил в текущей версии (github).
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

@JohnDoe, I posted a new version of mobdebug that modifies coro() methods per earlier discussion and also added handling of \\?\ path (can't test locally): https://github.com/pkulchenko/MobDebug/tree/far-support. Give it a try and let me know if this works better for you.
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 »

paulclinger wrote:Решил обобщить все изменения основываясь на этой дискусии:
[...]
Кроме перечисленного также высказывались следующие пожелание: (1, 2, 3)
  1. при завершении отладки выполнять done + пользовательскую функцию
  2. нужна команда для получения текущего статуса отладки: доступен ли отладчик? подключён ли в данный момент?
  3. команда start должна возвращать управление только после подтверждения готовности отладчика.
  4. команда breakhere, аналогичная команде IDE ShiftF9
  5. hasbreakpoint
  6. (set|remove|has)breakpoint могли бы принимать полные пути, и самостоятельно преобразовывать их к нужному виду.
  7. В IDE было бы неплохо обновлять точки останова, установленные/снятые извне
paulclinger wrote:- Incorrect activation with [ESC]: http://forum.farmanager.com/viewtopic.p ... 45#p116739
Это я уже исправил в текущей версии (github).
Заменил util.lua, теперь проблемы не вижу.
paulclinger wrote:I posted a new version of mobdebug that modifies coro() methods per earlier discussion and also added handling of \\?\ path (can't test locally)
Спасибо, с префиксом \\?\ теперь порядок.
Но хочу обратить внимание, что это лишь частный случай, и работа с путями всё ещё имеет серьёзный изъян.
Например если где-то в коде файл выполняется по относительному пути (dofile("my.lua")) - отладчик не сможет остановиться в этом файле.
По-хорошему, все относительные пути надо приводить к полным. Возможно даже стоит разворачивать символические ссылки.
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 »

Обнаружил проблему с print
В фаре эта функция переопределена, но при подключении отладчика переопределение отменяется.

(Проблема не связана с последними изменениями)
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 »

paulclinger wrote:- Ошибка при подсчете текущей строки: viewtopic.php?f=15&t=8487&start=45#p116702

это я воспроизвести никак не смог. Можно пример файла на котором это происходило и описание: точный размер окна в строчках, где точка останова и т.д.
Прилагаю архив с двумя файлами: sample.lua и sample2.lua.
Шаги для воспроизведения проблемы таковы:
  1. Распаковать архив и положить оба файла в одной папке рядом.
    Сделать эту папку корнем проекта.
    Убедиться что активна настройка editor.autoactivate
  2. Открыть в IDE sample2.lua
    1. Сделать ширину окна достаточной чтобы длинные строки помещались не сворачиваясь >=(82 символа).
    2. Отрегулировать высоту окна так, чтобы последняя строка (21) оказалась в самом низу.
    3. Уменьшить ширину окна так, чтобы длинные строки свернулись, и соответственно последняя строка файла скрылась из виду.
    4. Закрыть sample2.lua
  3. Открыть в IDE sample.lua
    1. Исправить значение корня проекта (переменную projectroot)
    2. Запустить отладку (F5)
В результате sample2.lua откроется, но не спозиционируется на точку останова.

Внимание: для воспроизведения важно чтобы sample2.lua в момент запуска отладки был закрыт
Attachments
sample.7z
(391 Bytes) Downloaded 161 times
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 »

Замечания по IDE:
  • Если в IDE не открыт файл (безразлично какой), то клиент не может инициировать отладку (Для чего это ограничение?)
    Ок, zbstudio.exe можно запустить с параметрами, и таким образом обеспечить вышеупомянутое условие (но не хватает возможности запустить сервер через параметр командной строки).
  • Если файлы редактируются извне (а не в IDE), то ZBS выводит диалог предлагая перезагрузить изменённый файл.
    И пока этот диалог на экране - отладчик недоступен.
    Однако, если файл редактировался извне, и отладка запущена клиентом, то мы даже не увидим этого диалога, пока не догадаемcя переключиться в IDE.
  • И ещё два непонятных мне ограничения:
    - сервер можно запустить, но нельзя остановить (пункт становится недоступен)
    - если хоть раз запустить отладку из IDE, то запуск сервера становится недоступен
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

Хочу сразу поблагодарить за детальные коментарии!

- при завершении отладки выполнять done + пользовательскую функцию

да onexit; еще думаю по этому поводу. Я думал что можно обойтись командой DONE и использовать ее вместо EXIT (задается debugger.detachonexit)

- нужна команда для получения текущего статуса отладки: доступен ли отладчик? подключён ли в данный момент?

планирую добавить метод который вернет (1) nil если нет отдадки (перед start или после done), (2) true если текущая coroutine отлаживается и (3) false если нет.

- команда start должна возвращать управление только после подтверждения готовности отладчика.

Так и должно быть. Она блокируется на connect, который завершается успешно если соединение установлено и отладка может идти. В какой ситуации это не работает?

- команда breakhere, аналогичная команде IDE ShiftF9

да, думаю добавить break() вызов.

- hasbreakpoint

а надо? как использовать?

- (set|remove|has)breakpoint могли бы принимать полные пути, и самостоятельно преобразовывать их к нужному виду.

это скорее нет, разве что set/remove, но не has, поскольку эта функция часто вызывается из debug.hook. А чем абсолютные пути лучше чем относительные? они все рано устанавливаются относительно project directory.

- В IDE было бы неплохо обновлять точки останова, установленные/снятые извне

Скорее нет, поскольку нет нормального способа передать это информацию.

- В результате sample2.lua откроется, но не спозиционируется на точку останова.

Спасибо за пример. Исправил (github).

> Если в IDE не открыт файл (безразлично какой), то клиент не может инициировать отладку (Для чего это ограничение?)

Исторические причины. Подумывал его убрать, но слишком много разнообразных комбинаций надо тестировать с различными engines, так что пока осталось.

> Ок, zbstudio.exe можно запустить с параметрами, и таким образом обеспечить вышеупомянутое условие (но не хватает возможности запустить сервер через параметр командной строки).

Есть такое, подумаю что сделать.

> Если файлы редактируются извне (а не в IDE), то ZBS выводит диалог предлагая перезагрузить изменённый файл.
> И пока этот диалог на экране - отладчик недоступен.
> Однако, если файл редактировался извне, и отладка запущена клиентом, то мы даже не увидим этого диалога, пока не догадаемcя переключиться в IDE.

Попробуй установить editor.autoreload = true. Если в IDE изменений не было а снаружи были, то файл будет перезагружен без вопросов. Добавлю в документацию; наверное надо включить по-умолчанию.

> И ещё два непонятных мне ограничения:
> - сервер можно запустить, но нельзя остановить (пункт становится недоступен)

А зачем?

> - если хоть раз запустить отладку из IDE, то запуск сервера становится недоступен

Это потому что он автоматически запускается когда стартуешь отладку из IDE, а потом уже доступен. Основная причина по которой сервер на запущен автоматически это то что пользователи жаловались что на некоторых машинах получают предупреждение что ZBS хочет открыть какой-то порт сразу как только запускаешь, и это пугало пользователей.
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 »

paulclinger wrote:да onexit; еще думаю по этому поводу. Я думал что можно обойтись командой DONE и использовать ее вместо EXIT (задается debugger.detachonexit)
Нет, помимо DONE хотелось бы отдельную функцию. Если отладка управляется прямо из приложения, то ему надо как-то сообщить о завершении.
paulclinger wrote:
команда start должна возвращать управление только после подтверждения готовности отладчика.
Так и должно быть. Она блокируется на connect, который завершается успешно если соединение установлено и отладка может идти. В какой ситуации это не работает?
В ситуации когда отладчик подключён к другому приложению (http://forum.farmanager.com/viewtopic.p ... 46#p116646)
paulclinger wrote:- hasbreakpoint
а надо? как использовать?
Мне надо для того чтобы реализовать toggle http://forum.farmanager.com/viewtopic.p ... 46#p116646
paulclinger wrote:
- (set|remove|has)breakpoint могли бы принимать полные пути, и самостоятельно преобразовывать их к нужному виду.
это скорее нет, разве что set/remove, но не has, поскольку эта функция часто вызывается из debug.hook. А чем абсолютные пути лучше чем относительные? они все рано устанавливаются относительно project directory.
А чтобы задать точку требуется (1)полный путь известный приложению привести к относительному виду (2)поменять слеши на прямые (3)преобразовать к нижнему регистру.
Основная проблема: приложение не знает ничего о project directory в IDE.
Можно решить проблему не трогая приватную has_breakpoint (т.е. нормализовывать путь только для отдельной публичной hasbreakpoint)
Или же просто предоставить публичную функцию norm_path (этот вариант мне нравится меньше).
paulclinger wrote:
- В IDE было бы неплохо обновлять точки останова, установленные/снятые извне
Скорее нет, поскольку нет нормального способа передать это информацию.
Разве передавать имеющуюся таблицу точек недостаточно?
paulclinger wrote:
Если файлы редактируются извне (а не в IDE), то ZBS выводит диалог предлагая перезагрузить изменённый файл.
Попробуй установить editor.autoreload = true. Если в IDE изменений не было а снаружи были, то файл будет перезагружен без вопросов.
Без вопросов плохо, т.к. удалятся точки останова (что если на основе diff пытаться их сохранить?)
Может быть можно исправить ситуацию иначе? Например не выводить сообщение сразу, а подождать пока ZBE получит фокус.
paulclinger wrote:
сервер можно запустить, но нельзя остановить (пункт становится недоступен)
А зачем?
если хоть раз запустить отладку из IDE, то запуск сервера становится недоступен
Это потому что он автоматически запускается когда стартуешь отладку из IDE, а потом уже доступен.
Этот момент был для меня неочевиден. Может быть стоит отметить пункт в меню галкой?
Post Reply

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