Отладка в ZeroBrane Studio

Здесь обсуждается всё, что касается макросов.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

Latest post of the previous page:

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

> Но хочу обратить внимание, что это лишь частный случай, и работа с путями всё ещё имеет серьёзный изъян.
> Например если где-то в коде файл выполняется по относительному пути (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: 10823
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: 10823
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 желательно сообщать об ошибках через возвращаемые значения.
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 »

О неудобствах сообщил, пожелания высказал.
Надеюсь автор примет во внимание, ну а пока для обхода "скользких" мест набросал модуль-обёртку с таким интерфейсом:
  • attach(on_detach)
    Надстройка над mobdebug.start.
    В случае ошибки не пытается использовать print, а возвращает вторым значением текст.
    Т.к. отладчик при завершении отладки посылает os.exit - данная функция переопределяется, для выполнения mobdebug.done() и др.
    Первый параметр: функция, выполняемая при отключении от отладчика.
    detach() - парная функция, позволяющая завершить отладку из приложения (а не из IDE).
  • on(), off() - соответствуют одноимённым функциям mobdebug.
  • status(param) - функция, позволяющая получить состояние, соответствующее заданному параметру.
    Параметр может быть одной из строк: "attached","on"
  • coro(set) - вариант исправленный как обсуждалось.
    При запуске без параметров переопределяет coroutine.createwrap
    При запуске c параметром true/false только возвращает патченые/оригинальные функции.
  • breakhere() - выполнение приостанавливается
  • hasbreakpoint(file,line) - проверка существования точки останова.
    Плюс функции setbreakpoint/removebreakpoint, переопределённые так, чтобы файла можно было задавать полным путём, не заботясь об переводе слешей в прямые, и о том где сейчас корень проекта.
  • setprojectroot(path) - служит для установки корневой папки проекта.
    Необходим однократный вызов, от этого зависят функции breakhere и *breakpoint
    Надеюсь что это временное решение, т.к. выбор папки всё-таки производится в IDE, и не очень осмысленно дублировать этот выбор вызовом из отлаживаемого приложения.
  • dbgprint(...) - вывод в IDE окно Output.
    Для правильной работы необходимо добавить в конфиг ZBS опцию debugger.redirect = "c"
    (где искать файл конфигурации см. первый шаг инструкции в шапке)
    Внимание: в данном модуле предпринимаются специальные действия для исключения побочных эффектов опции debugger.redirect = "c".
    Использовать эту опцию при отладке макросов фара без данного модуля не рекомендуется
Часть перечисленных функций реализованы в неполноценно, т.к. отсутствует поддержка со стороны mobdebug.
Хотелось бы иметь всё это сразу в mobdebug без каких-либо обёрток.
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 (кроме AltF5).
Большая часть макросов предназначена для редактора в котором открыт *.lua скрипт.
AltF5 и ShiftF9 - исключение, они для области Common (только во время отладки).
  • F5 - подключиться к отладчику (начать отладку)
  • ShiftF5 - отключиться от отладчика (завершить отладку)
  • AltF5 - (временно) выключить/включить отладку не отключаясь от отладчика.
    Может быть полезно, т.к. отладка существенно замедляет выполнение кода.
  • ShiftF9 - прервать выполнение текущего скрипта и перейти в IDE.
    Внимание: для работы F9 и ShiftF9 важно чтобы папка проекта, устанавливаемая командой ZBS.setprojectroot (в самом начале файла) совпадала с той, что назначена в IDE.
  • F9 - установить/снять точку останова.
    Точки останова можно менять в любой момент, но работают (естественно) только во время отладки.
    Внимание: точки установленные/снятые в редакторе фара (пока?) не отображаются в IDE.
Особенности: corotine.create и coroutine.wrap подменяются только во время отладки, и восстанавливаются при её завершении, или временном выключении.


В макросах используется модуль zbs.lua из поста выше.
Всё вместе можно скачать из вложения, и распаковать в %FARPROFILE%\Macros\
Attachments
zbs.7z
(1.74 KiB) Downloaded 197 times
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

John Doe wrote:
paulclinger wrote:
Если файлы редактируются извне (а не в IDE), то ZBS выводит диалог предлагая перезагрузить изменённый файл.
Попробуй установить editor.autoreload = true. Если в IDE изменений не было а снаружи были, то файл будет перезагружен без вопросов.
Без вопросов плохо, т.к. удалятся точки останова (что если на основе diff пытаться их сохранить?)
Может быть можно исправить ситуацию иначе? Например не выводить сообщение сразу, а подождать пока ZBE получит фокус.
Добавил сохранение и восстановление всех маркеров. Если количество строк в файле остался тем же, то восстанавливает по номерам строк. если изменилось, то ищет по совпадение строк с окресности оригиналов. В github репозитории...
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Отладка в ZeroBrane Studio

Post by John Doe »

Никто часом не составлял luafar api-файл для ZBS?
(Тот что для автодополнения и подсказок)
Last edited by John Doe on Fri 09 Sep, 2016 23:02, edited 1 time in total.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Отладка в ZeroBrane Studio

Post by Shmuel »

John Doe wrote: Никто часом не составлял luafar api-файл для ZBS?
Нет. По-видимому, можно написать скрипт для генерации этого файла из luafar_manual.tsi.
Post Reply

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