Отладка в ZeroBrane Studio

Здесь обсуждается всё, что касается макросов.
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:

John Doe wrote:окно скроллируется к текущей инструкции, и то почему-то не всегда.
Кажется нашёл в чем проблема.
Похоже при позиционировании проверяется "видимость" текущей строки на экране, чтобы избежать лишних прыжков, в случае когда строка и так на экране.
И при определённых условиях эта логика даёт сбой.

Пример:
  • Точка останова находится в файле, ещё не открытом в IDE.
  • Точка останова попадает в конец экрана.
    (Например высота экрана 20 строк, и точка останова в 20й строке файла)
  • Выше точки останова есть длинные строки, чтобы при открытии в IDE получился перенос.
Другая проблема с позиционированием возникает также в случае, когда в файл почему-то попадает [ESC] (описано на прошлой странице: http://forum.farmanager.com/viewtopic.p ... 63#p116663)
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Как-то обойти бы эту фичу, сильно мешает.

Ну вообще-то должно правильно работать. А можно пример когда мешает?

> В конце концов это неважно (а кому важно тот наверняка и без нас знает как обращаться с модулями)

Согласен.

> Похоже при позиционировании проверяется "видимость" текущей строки на экране, чтобы избежать лишних прыжков, в случае когда строка и так на экране.
> И при определённых условиях эта логика даёт сбой.

Это похоже на ошибку, я проверю. Спасибо за описание.

> Другая проблема с позиционированием возникает также в случае, когда в файл почему-то попадает [ESC] (описано на прошлой странице: viewtopic.php?p=116663#p116663)
> Выполнение останавливается как и требовалось, но есть один странный эффект: в текущую позицию редактора IDE вставляется [ESC] (приходится отменять по CtrlZ). Проявляется не каждый раз, понаблюдаю.

Это я вообще не понял; никаких идей по поводу откуда этому [ESC] взятся. И как мне это воспроизвести чтобы отладить?

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

А что курсором делать? Редактирование-то все-равно выключено.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

paulclinger wrote:А что курсором делать? Редактирование-то все-равно выключено.
Много чего:
1. Выделять текст, чтобы скопировать куда-то.
2. Осуществлять Code browsing (если IDE это поддерживает).
3. Вызывать контекстное меню — по [b]Apps[/b] или [b]ShiftF10[/b] и дальше стрелочки и [b]Enter[/b].
4. Вызывать главное меню — по [b]Alt[/b] или [b]F10[/b] и дальше стрелочки и [b]Enter[/b].
5. Использовать любые кнопкосочетания, которые делают что-либо полезное с текущим выделением (закладки и пр.).
Просто среди пользователей Фара много тех, для кого основное средство ввода — это именно клавиатура.
Фар есть инструмент, а не нянька. © 2009 DrKnS
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:
Как-то обойти бы эту фичу, сильно мешает.
Ну вообще-то должно правильно работать. А можно пример когда мешает?
Например интересует работа системы макросов вообще. Шагаю свободно по коду, и в какой-то момент хочу выйти из текущей функции CtrlF10 (StepOut).
Однако вместо того чтобы остановиться - выполнение продолжается, как будто я нажал Continue (F5)
Со StepOver тоже наблюдал подобный эффект.
Дайте знать если нужны чёткие шаги для воспроизведения.

Возможно это нетипичный случай. Но может быть возможно сделать опцию для управления поведением?
paulclinger wrote:
Выполнение останавливается как и требовалось, но есть один странный эффект: в текущую позицию редактора IDE вставляется [ESC] (приходится отменять по CtrlZ). Проявляется не каждый раз, понаблюдаю.
Это я вообще не понял; никаких идей по поводу откуда этому [ESC] взятся. И как мне это воспроизвести чтобы отладить?
Повторяется нестабильно, зависимости пока не установил. (Когда получится добиться стабильного воспроизведения - я напишу)
paulclinger wrote:
Также показалось неудобным что курсор не следует за исполняемой в данный момент строкой кода, и для перехода приходится кликать мышью.
А что курсором делать? Редактирование-то все-равно выключено.
К тому, что уже указал HaRT добавлю простой пример: в процессе шагания по F10 хочу установить точку останова, жму на клавиатуре стрелку рассчитывая переместится относительно текущей команды, но неожиданно обнаруживаю что переместился черт знает куда, т.к. реальная позиция курсора была далеко от текущей команды.

Кстати почему нельзя устанавливать точки не прерывая выполнение? Это неудобно само по себе, и вдобавок после ShiftF9 IDE позиционируется на текущую команду, которая вообще в другом файле.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Однако вместо того чтобы остановиться - выполнение продолжается, как будто я нажал Continue (F5)
> Со StepOver тоже наблюдал подобный эффект.
> Дайте знать если нужны чёткие шаги для воспроизведения.
> Возможно это нетипичный случай. Но может быть возможно сделать опцию для управления поведением?

Это выглядит как ошибка. А откуда управление попало в эту функцию?

> Далее открыть в редакторе любой lua файл, нажать F5 для подсоединения к отладчику, и далее (в фаре же) ShiftF9.
> После этого в редакторе IDE наблюдаю неверное позиционирование и иногда вставляется [ESC].
> Ещё одна странность (поначалу показалось что фича): при срабатывании точки останова иногда выскакивает Windows Task Manager, тот что вызывается по CtrlShiftEsc. Возможно эти эффекты связаны.

Связаны, так что действительно это навело меня на объяснение. Во время активации выполняется следующая логика:

-- found the window, now need to activate it:
-- send some input to the window and then
-- bring our window to foreground (doesn't work without some input)
winapi.send_to_window(0x1B)
for _, w in ipairs(wins) do w:set_foreground() end

Похоже что если при этом нажат Ctrl или Shift, то получается незапланированный эффект. Есть какой-нибудь лучше способ?

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

Понял. Убедительные примеры :)

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

> Кстати почему нельзя устанавливать точки не прерывая выполнение? Это неудобно само по себе, и вдобавок после ShiftF9 IDE позиционируется на текущую команду, которая вообще в другом файле.

Можно будет. Запланировано, но пока не реализовано.
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:
Однако вместо того чтобы остановиться - выполнение продолжается, как будто я нажал Continue (F5)
Со StepOver тоже наблюдал подобный эффект.
Это выглядит как ошибка. А откуда управление попало в эту функцию?
Пока не разбирался.
Но воспроизвести легко: запустить отладку как описано в шапке, и затем в IDE нажать Break (ShiftF9).
Далее Step Out (CtrlF10). В зависимости от текущей функции может понядобиться несколько нажатий.

Ещё одна странность связана с mobdebug.off: часто не срабатывает.
Повторные вызовы не помогают (время задержки не влияет).
Но если вызов обернуть в корутину, то в конце концов сработает, хотя может понадобиться большое количество вызовов (>700).

А если вызов поставить в очередь макросов, то для срабатывания может понадобиться 1 - 15 итераций.
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

>>>Однако вместо того чтобы остановиться - выполнение продолжается, как будто я нажал Continue (F5)
>>>Со StepOver тоже наблюдал подобный эффект.
>>Это выглядит как ошибка. А откуда управление попало в эту функцию?
>Пока не разбирался.
>Но воспроизвести легко: запустить отладку как описано в шапке, и затем в IDE нажать Break (ShiftF9).
>Далее Step Out (CtrlF10). В зависимости от текущей функции может понядобиться несколько нажатий.

А где функция которая вызвала ту в которой управление было остановлено? Дело в том что логика проста: когда вызывается Step Out, отладчик запоминает текущий уровень стека и пропускает все команды пока не дойдет до уровня стека -1. Все работает если вызов функции происходит из lua кода:

function a()
...
end

function b()
a()
... --<-- step out of a() will stop here
end

Но если вызов a() произошел из C/C++ кода, то остановиться негде и поскольку любые другие части lua кода будут иметь более глубокий стек, то step out никогда и не остановится.

> Ещё одна странность связана с mobdebug.off: часто не срабатывает.
> Повторные вызовы не помогают (время задержки не влияет).

off() выключает отладку только в текущей coroutine или "main" coroutine. А как видно что не работает?
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:Но если вызов a() произошел из C/C++ кода, то остановиться негде и поскольку любые другие части lua кода будут иметь более глубокий стек, то step out никогда и не остановится.
Интересно как такое может происходить со Step Over. Я понаблюдаю.
paulclinger wrote:off() выключает отладку только в текущей coroutine или "main" coroutine. А как видно что не работает?

Code: Select all

require"mobdebug".off(); far.Show(debug.gethook())
Наверно debug.gethook тут мне не помощник...

А что значит "или main coroutine"? Как по замыслу предполагается из текущей корутины отключить отладку основной корутины?
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Наверно debug.gethook тут мне не помощник...

надо наверное пробовать debug.gethook(coroutine.running())

> А что значит "или main coroutine"? Как по замыслу предполагается из текущей корутины отключить отладку основной корутины?

Я только хотел сказать что off() отключает отладку текущей coroutine или, если выполнение происходит в main chunk, то отладку в main chunk.

Это значит что если сделать on() в одной coroutine и в другой, то off() в одной из них выключит отладку только в той одной.
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:надо наверное пробовать debug.gethook(coroutine.running())
Как я понимаю gethook без параметров именно с текущей корутиной и работает.
Во всяком случае добавление этого параметра не меняет ничего.
И как я писал выше, самое интересное в том, что несколькими повторениями можно добиться того, чтобы вызов gethook возвращал nil (это и сбило меня с толку)
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 »

Кстати вопрос: можно ли обойтись без искуственного добавления mobdebug.on() в код каждой корутины?
Может ли отладчик сам отследить выполнение coroutine.resume, получить thread, и установить hook?

Update
Хотя похоже я чего-то вообще не понимаю.
  1. local c = coroutine.create(function()
  2.  
  3.   local t = coroutine.running()
  4.  
  5.   print (t)
  6.  
  7. end)
  8.  
  9.  
  10.  
  11. debug.sethook(function(l,n)
  12.  
  13.   if coroutine.running()==c then
  14.  
  15.   print(l,n,debug.getinfo(2).func)
  16.  
  17.   end
  18.  
  19. end,"crl")
  20.  
  21.  
  22.  
  23. coroutine.resume(c)
  24.  
  25.  
  26.  
  27. debug.sethook()
При выполнении этого кода получаю вывод:

Code: Select all

call    nil     function: 0x002ebc98
line    2       function: 0x002ebc98
call    nil     function: builtin#31
line    3       function: 0x002ebc98
call    nil     function: builtin#29
call    nil     function: builtin#18
thread: 0x002ebcb0
line    4       function: 0x002ebc98
return  nil     function: 0x002ebc98
Видно что в этом простом примере функция-хук без проблем вызывается в корутине.
В чём же разница с mobdebug?

Обращаю внимание что при установке хука в примере не используется параметр thread (для чего он тогда вообще?)
paulclinger
Posts: 33
Joined: Sun 10 Mar, 2013 18:25

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

Post by paulclinger »

> Видно что в этом простом примере функция-хук без проблем вызывается в корутине.
> В чём же разница с mobdebug?

Я так понимаю, это запущено в ZBS, да? ZBS использует LuaJIT, не Lua 5.1, а LuaJIT ведет себя в этом смысле по-другому: у него только один дебаг хук, который работает везде (thread параметер игнорируется): http://lua-users.org/lists/lua-l/2011-06/msg00513.html

> Кстати вопрос: можно ли обойтись без искуственного добавления mobdebug.on() в код каждой корутины?
> Может ли отладчик сам отследить выполнение coroutine.resume, получить thread, и установить hook?

Да, require('mobdebug').coro() это и делает, только для coroutine.create а не coroutine.resume(). Это позволяет вызывающему процессу легко контролировать какие coroutines можно отлаживать, а какие нет (из соображений производительности).
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: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: 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 предпринимает какие-то специальные действия, чтобы не запускаться в корутинах?
Да. Если 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 в данном случае.
Post Reply

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