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

Обнаружил проблему с 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 »

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 165 times
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 »

Замечания по 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: 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:да 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, а потом уже доступен.
Этот момент был для меня неочевиден. Может быть стоит отметить пункт в меню галкой?
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

Пропустил несколько моментов:

> Но хочу обратить внимание, что это лишь частный случай, и работа с путями всё ещё имеет серьёзный изъян.
> Например если где-то в коде файл выполняется по относительному пути (dofile("my.lua")) - отладчик не сможет остановиться в этом файле.

Нет, это все должно работать. Если не работает, или что-то странное с путями, или ошибка в отладчике. Пример можно?
Если точно не работает, можете запустить из файла который не отлаживается: print(debug.getinfo(1,"S").source)? И какой путь установлен в качестве директории проекта?

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

А где она переопределяется в Fare? Где-нибудь между local mdb = require('mobdebug') и start()? print действительно переназначается когда отладчик получает OUTPUT команду, но она должна посылаться только когда debugger.redirect установлен и в нашем случае он не должен быть установлен.

Можно включить debugger.verbose=true и посмотреть на сообщения в Output window. Там должно быть "output stdout...".

> Без вопросов плохо, т.к. удалятся точки останова (что если на основе diff пытаться их сохранить?)
> Может быть можно исправить ситуацию иначе? Например не выводить сообщение сразу, а подождать пока ZBE получит фокус.

Так оно и должно выводиться только при переключении фокуса.
Я могу попытаться сохранить все маркеры и восстановить их двумя способами: (1) если количество строчек не поменялось, то восстановить на тех же строчках, (2) если поменялось, то проверить на совпадение строчек в окресностях прежних маркеров (+-10 строчек) и восстановить если строчки не поменялись. Не 100%, но должно работать в большинстве случаев.
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:планирую добавить метод который вернет (1) nil если нет отдадки (перед start или после done), (2) true если текущая coroutine отлаживается и (3) false если нет.
Хотелось бы различать ещё 2 случая:
- сервер не найден
- сервер занят
paulclinger wrote:
Например если где-то в коде файл выполняется по относительному пути (dofile("my.lua")) - отладчик не сможет остановиться в этом файле.
Нет, это все должно работать. Если не работает, или что-то странное с путями, или ошибка в отладчике. Пример можно?
Пока текущая папка соответствует папке проекта - всё в порядке. Но ведь нельзя на это полагаться:

Edit
Как выяснилось, проблема с print возникает только если изменить опцию debugger.redirect = "c"

Не смертельно конечно, просто хотелось получить возможность вывода в окошко output...
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

paulclinger wrote:Так оно и должно выводиться только при переключении фокуса.
Для привлечения внимания можно было бы до получения фокуса ввода применить комбинацию из MessageBeep и/или FlashWindowEx, как рекомендует MSDN.
paulclinger wrote:проверить на совпадение строчек в окресностях прежних маркеров (+-10 строчек) и восстановить если строчки не поменялись
Рекомендую ориентироваться на функциональность никсовой команды patch, когда она ищет, куда наложить заплатку.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

John Doe wrote:Не смертельно конечно, просто хотелось получить возможность вывода в окошко output...
Отладчик Visual Studio, например, выводит туда то, что приложение пишет через OutputDebugString
Фар есть инструмент, а не нянька. © 2009 DrKnS
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Хотелось бы различать ещё 2 случая: - сервер не найден - сервер занят

Это не получится. Клиент ничего об этом не знает, пока не подключится.

> Теперь пробуем dofile без пути: заменям строку на dofile("sample2.lua") и запускаем отладку.
> Видим что приложение отработало нормально, но точка останова не сработала ("@sample2.lua")

Да, возможны ситуации когда текущий механизм не работает. Я добавлю в документацию.

Поскольку приложение может делать что угодно (а некоторые так вообще могут специфическую файловую систему использовать), я тут полагаюсь на тот путь который рапортуется интерпретатором. В принципе можно добавить basedir функцию, которая будет возвращать и устанавливать basedir, и всегда возвращать полный путь, но даже в это случае нужно будет ручками в скрипте устанавливать basedir. Проще загрузить файл по полному пути.

> Как выяснилось, проблема с print возникает только если изменить опцию debugger.redirect = "c"

Да, это используется чтобы послать вывод из скрипта в IDE.

> И при использовании этой функции текст выволится прямо в окно IDE "Output".
> Не смертельно конечно, просто хотелось получить возможность вывода в окошко output...

А вот это я не понял: так вывод переопределяется или нет? должен переопределяться и выводить в окно Output. Причем если используется "c", то вывод должен идти в оба места.

> Для привлечения внимания можно было бы до получения фокуса ввода применить комбинацию из MessageBeep и/или FlashWindowEx, как рекомендует MSDN.

Да, это и происходит. Я использую wxwidgets RequestUserAttention который использует FlashWindowEx.

> Рекомендую ориентироваться на функциональность никсовой команды patch, когда она ищет, куда наложить заплатку.

Согласен. Уже посмотрел, они по умолчанию только на 2 строчки вокруг ищут.

> Отладчик Visual Studio, например, выводит туда то, что приложение пишет через OutputDebugString…

Это мне не доступно, поскольку я могу работать только через то что мне wxlua предоставляет.
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:
Хотелось бы различать ещё 2 случая: - сервер не найден - сервер занят
Это не получится. Клиент ничего об этом не знает, пока не подключится.
При неудаче start мог бы возвращать дополнительные значения: код/текст ошибки.
paulclinger wrote:Да, возможны ситуации когда текущий механизм не работает. Я добавлю в документацию.
Отладчик мог бы сам разворачивать относительные имена, и механизм работал бы.
paulclinger wrote:А вот это я не понял: так вывод переопределяется или нет? должен переопределяться и выводить в окно Output. Причем если используется "c", то вывод должен идти в оба места.
Переопределяется, но неприемлемым образом.
- назначение функции print в фаре иное, чем принято, она не предназначена для вывода в консоль
- при перехвате ("c") функция перестаёт выполнять исходную функцию
- даже если бы и выполняла, эта исходная функция несовместима с выводом в консоль, и перехватывать её бессмысленно

Предлагаю пойти иным путём: mobdebug может просто предоставлять функцию dbgprint.

P.S.
Заметил что IDE часто не определяет что файл изменён извне, и не предлагает его перегрузить.
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 »

mobdebug.lua:1446 wrote:

Code: Select all

if set == true then return corostub(cocreate), corostub(cowrap) end
Команду coro может понадобиться вызывать неоднократно. И каждый раз возвращаемые функции создаются заново.
Это конечно не проблема, я бы и не заметил, если бы понадобилось их сравнить (чтобы определить отлаживаются ли в данный момент корутины)
mobdebug.lua:1443 wrote:

Code: Select all

  if set == nil and cocreate then return end -- only set once
Может быть лучше if set == nil and cocreate~=coroutine.create then return end ?
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> При неудаче start мог бы возвращать дополнительные значения: код/текст ошибки.

Надо посмотреть, скорее всего можно добавить.

> Да, возможны ситуации когда текущий механизм не работает. Я добавлю в документацию.
> Отладчик мог бы сам разворачивать относительные имена, и механизм работал бы.

Не получится. Это требует получения текущей директории, а для этого нужен lfs или что-то подобное.

> Переопределяется, но неприемлемым образом.
> - назначение функции print в фаре иное, чем принято, она не предназначена для вывода в консоль
> - при перехвате ("c") функция перестаёт выполнять исходную функцию
> - даже если бы и выполняла, эта исходная функция несовместима с выводом в консоль, и перехватывать её бессмысленно
> Предлагаю пойти иным путём: mobdebug может просто предоставлять функцию dbgprint.

Согласен, для Far это не самый подходящий вариант. Функцию добавлять смысла нет, поскольку можно все это сделать локально:

local farprint = print
require('mobdebug').start()
dbgprint, print = print, farprint

> Заметил что IDE часто не определяет что файл изменён извне, и не предлагает его перегрузить.

Это странно, но возможно если дата на файле не изменена. ZBS проверяет дату и если она не изменилась, то изменения не обнаружит. Если дата изменена, может включен autoreload и файл таки незаметно перегружается?

> Команду coro может понадобиться вызывать неоднократно. И каждый раз возвращаемые функции создаются заново.

Да, с этой логикой что-то не то: coro(true) и потом coro() правильно работать тоже не будут, поскольку cocreate уже установлен. Надо подумать и исправить. Спасибо за намек.
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:Не получится. Это требует получения текущей директории, а для этого нужен lfs или что-то подобное.
lfs разве проблема? В ZBS используется.
paulclinger wrote:Функцию добавлять смысла нет, поскольку можно все это сделать локально:

local farprint = print
require('mobdebug').start()
dbgprint, print = print, farprint
coro() тоже можно сделать локально.

IMHO функция mobdebug была бы удобнее чем настройка где-то в конфигах IDE.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

>> Не получится. Это требует получения текущей директории, а для этого нужен lfs или что-то подобное.
> lfs разве проблема? В ZBS используется.

lfs не используется в ZBS; он включен поскольку используется в luadist, но это только на стороне IDE, а для отладки надо чтобы это было в отладчике/приложении (а там lfs может не быть или не поддерживаться вообще).

> coro() тоже можно сделать локально.

можно конечно, но сложнее чем dbgprint ;)
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:(а там lfs может не быть или не поддерживаться вообще).
Там где нет или не поддерживается - ничего не поделаешь.
А там где есть - почему бы не использовать.
paulclinger wrote:
coro() тоже можно сделать локально.
можно конечно, но сложнее чем dbgprint ;)
Код, приведённый вами выше зависит от того
- активен ли в данный момент сервер
- установлена ли в конфиге IDE опция debugger.redirect
Это по меньшей мере ненадёжно.
Edit: Похоже первый вызов mobdebug.on также переназначает print/dbgprint
paulclinger wrote:
При неудаче start мог бы возвращать дополнительные значения: код/текст ошибки.
Надо посмотреть, скорее всего можно добавить.
В mobdebug сейчас для сообщения об ошибках используется вывод в консоль (print).
В фаре это представляет проблему, т.к. print переопределён, и его вызов из mobdebug ведёт к нежелательным последствиям.
Поэтому вместо print желательно сообщать об ошибках через возвращаемые значения.
Post Reply

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