Отладка в ZeroBrane Studio

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

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

Post by John Doe »

Latest post of the previous page:

paulclinger wrote:ZBS использует LuaJIT, не Lua 5.1
Дело в том, что фар также использует LuaJIT.
И в свете это новой для меня информации о хуках в LuaJIT, возникают новые вопросы:
В случае LuaJIT имеет ли значение откуда выполнена команда mobdebug.on/off? Разве не должны эти команды распространяться и на корутины?
Или mobdebug предпринимает какие-то специальные действия, чтобы не запускаться в корутинах?
paulclinger wrote:Да, require('mobdebug').coro() это и делает, только для coroutine.create а не coroutine.resume().
Команда coro вмешивается в исходный код приложения.
И это не сработает в случае когда coro вызывается позже, чем приложение успело локализовать coroutine.create.
Т.е. я хочу сказать о том, что способ хотя и приемлемый, но всё-таки несовершенный. Если возможны альтернативы - их стоит рассмотреть.
paulclinger wrote:Это позволяет вызывающему процессу легко контролировать какие coroutines можно отлаживать, а какие нет (из соображений производительности).
Врядли можно сказать что сoro что-то позволяет контроллировать, т.к. эту команду можно использовать только раз.
Вот команды on/off действительно имеют такую возможность.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> В случае LuaJIT имеет ли значение откуда выполнена команда mobdebug.on/off? Разве не должны эти команды распространяться и на корутины?

Не имеет. Должны.

> Или mobdebug предпринимает какие-то специальные действия, чтобы не запускаться в корутинах?

Да. Если debug hook был вызван из coroutine которая не была "включена" вызовом coro() или on(), он игнорируется. Эта логика в mobdebug.lua в районе строчки 450.

> Врядли можно сказать что сoro что-то позволяет контроллировать, т.к. эту команду можно использовать только раз.

Я имел ввиду что в программе можно сделать mycreate=coroutine.create перед вызовом coro() и все coroutine которые созданы coroutine.create будут отлаживаться, а все которые созданы с использованием mycreate не будут.
User avatar
John Doe
Бюрократ
Posts: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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

Post by John Doe »

paulclinger wrote:
Или mobdebug предпринимает какие-то специальные действия, чтобы не запускаться в корутинах?
Да. Если debug hook был вызван из coroutine которая не была "включена" вызовом coro() или on(), он игнорируется. Эта логика в mobdebug.lua в районе строчки 450.
Вот оно что!
Для человека неискушённого написанием отладчиков кажется более практичным обратный подход: если бы хук работал по умолчанию во всех корутинах, а при необходимости отключался бы специальной командой.
paulclinger wrote:Я имел ввиду что в программе можно сделать mycreate=coroutine.create перед вызовом coro() и все coroutine которые созданы coroutine.create будут отлаживаться, а все которые созданы с использованием mycreate не будут.
Не слишком очевидный подход, так можно запутать всё ещё больше.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Для человека неискушённого написанием отладчиков кажется более практичным обратный подход: если бы хук работал по умолчанию во всех корутинах, а при необходимости отключался бы специальной командой.

Может быть, но я основывался на поведении Lua 5.1 and Lua 5.2. Поведение LuaJIT может рассматриваться как implementation detail в данном случае.
User avatar
John Doe
Бюрократ
Posts: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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

Post by John Doe »

Даже основываясь на поведении 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: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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. -- and later --
  3. mycreate(...)
  4. 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: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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

Post by John Doe »

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

Ещё функция coro может получать параметр, при запуске которого будут возвращаться оригинальные функции.
  1. -- включить отладку в корутинах
  2. coroutine.create, coroutine.wrap = require('mobdebug').coro(true)
  3. -- выключить отладку в корутинах
  4. coroutine.create, coroutine.wrap = require('mobdebug').coro(false)
User avatar
John Doe
Бюрократ
Posts: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

Отладка в 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: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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: 13387
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 54 times
Been thanked: 350 times

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

Post by John Doe »

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

(Проблема не связана с последними изменениями)
Post Reply

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