> Всё работает, в IDE останавливается где положено.
> Однако визуально изменения не отображаются, т.е. новые точки не отображаются, а старые не убираются.
Да, обмен данными о точках останова идет в одну сторону, от IDE к приложению. Это было бы наверное интересно рапортовать текущий список после остановки, но пока никакой потребности на было, поскольку точки останова контролировались самим IDE. Подумаю над механизмом...
Re: Отладка в ZeroBrane Studio
Posted: Wed 12 Feb, 2014 23:03
by John Doe
Что если мы захотим завершить отладку, и продолжить работу с приложением.
Было бы неплохо вернуть coroutine.create в изначальное состояние.
mobdebug.lua конечно же не предусматривает функции "uncoro", но мы можем и самостоятельно запомнить/восстановить исходное значение.
Есть одно маленькое "но": после этого мы уже не сможем повторно использовать команду "coro", т.к. в mobdebug.lua:1407 есть условие:
if cocreate and cocreate~=coroutine.create then return end -- only set once
Было бы совсем просто при наличии "uncoro" но я понимаю, что пожелание весьма специфическое, поэтому необязательно.
Edit
Это всё ерунда, ведь никто не мешает определить любые функции coro/uncoro в своём коде.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 00:12
by paulclinger
John Doe wrote:Это всё ерунда, ведь никто не мешает определить любые функции coro/uncoro в своём коде.
Да, это возможно, но предложение интересное. mobdebug уже предоставляет done() вызов, который завершает отладку и убирает все ее следы, но продолжает приложение. В принципе, можно добавить в свой скрипт os.exit = require('mobdebug').done и тогда Stop в ZBS будет выключать отладку а не убивать приложение.
Я могу добавить восстановление coroutine.create как часть done() логики, но это не большая проблема, поскольку on() вызов ничего не делает если отладка не запущена, а сам вызов оригинального метода выполнен ка tail call, так что его даже в стеке не видно.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 00:16
by John Doe
paulclinger wrote:но это не большая проблема
Знаю, это во мне перфекционизм играет )
Поэтому себе уже сделал восстановление
package.nounload.mobdebug = true
if not ZBS then
_G.ZBS = {}
ZBS.cocreate = coroutine.create
ZBS.cocreate_mod = function(f, ...)
return ZBS.cocreate(function(...)
require"mobdebug".on()
return f(...)
end, ...)
end
ZBS.osexit = os.exit
else
coroutine.create = ZBS.enabled and ZBS.cocreate_mod or ZBS.cocreate
end
P.S.
В done не стоит восстанавливать coroutine.create
Во всяком случае в той системе, что я уже практически доделал - это мешало бы.
Впрочем, надо ещё подумать.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 00:29
by John Doe
Сейчас приходится делать много приседаний вокруг того, что при завершении отладки посылается os.exit().
Может быть стоит добавить для функции start опциональный параметр - функцию, выполняемую при завершении.
По умолчанию пусть остаётся os.exit, а в фаре будем указывать mobdebug.done
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 01:56
by paulclinger
> Может быть стоит добавить для функции start опциональный параметр - функцию, выполняемую при завершении.
Я думал по этому поводу, но по-моему не самый оптимальный вариант, поскольку start() уже имеет несколько опциональных параметров.
Другие варианты:
1. локализовать os.exit внутри mobdebug. Это позволит установить os.exit в нужное значение, а после start(), восстановить.
2. добавить onexit вызов в mobdebug, который по умолчанию вызовет done() и os.exit(). Пользователи смогут назначить что-то другое.
3. добавить debugger.detachonstop опцию в ZBS. Это потребует дополнительной команды в mobdebug, но я уже подумывал ее добавить, так что detachonstop будет посылать DONE вместо EXIT. Это позволит добавить в ZBS команду Detach в дополнении к Stop.
Пока сколоняюсь к последнему варианту.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 07:56
by John Doe
paulclinger wrote:2. добавить onexit вызов в mobdebug, который по умолчанию вызовет done() и os.exit(). Пользователи смогут назначить что-то другое.
Мне больше нравится этот вариант, т.к. он позволяет приложению отреагировать на завершение отладки.
Я сейчас это использую переопределяя os.exit
local info = debug.getinfo(1)
local name,line = norm(info.source:match"@(.+)"),info.currentline+2
mobdebug.setbreakpoint(name,line); mobdebug.removebreakpoint(name,line)
Вызываю это из фара макросом на ShiftF9.
Выполнение останавливается как и требовалось, но есть один странный эффект: в текущую позицию редактора IDE вставляется [ESC] (приходится отменять по CtrlZ). Проявляется не каждый раз, понаблюдаю.
Также показалось неудобным что курсор не следует за исполняемой в данный момент строкой кода, и для перехода приходится кликать мышью.
И ещё одно серьёзное неудобство: Step over (ShiftF10) и Step out (CtrlF10) не останавливают выполнение после выхода из текущей функции.
Приглашаю заинтересованных проверить ничего ли я не упустил.
Половину пунктов как следует не тестировал, поскольку в моей конфигурации всё несколько иначе (напр. пункт 2a проверен только в для случая когда профиль расположен в %FARHOME%)
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 10:00
by Shmuel
Отлично - то, что надо. Но лучше в шапку поместите.
P.S. Надо поправить: ZBS 0.40, а не 0.4.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 10:35
by John Doe
Сделано.
А что скажете по поводу:
John Doe wrote:И ещё одно серьёзное неудобство: Step over (ShiftF10) и Step out (CtrlF10) не останавливают выполнение после выхода из текущей функции.
Может такое поведение нормально?
(я с отладчиками по жизни не сталкиваюсь)
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 10:52
by Shmuel
John Doe wrote:
John Doe wrote:И ещё одно серьёзное неудобство: Step over (ShiftF10) и Step out (CtrlF10) не останавливают выполнение после выхода из текущей функции.
Может такое поведение нормально?
Насколько я понимаю, само слово Step намекает на остановку выполнения по завершению действия.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 12:12
by HaRT
Я как человек, часто и помногу работающий в отладчиках, прошу придерживаться привычного поведения и устоявшейся терминологии.
1. Запустить программу для отладки — Run/Start, начать отладку уже запущенной программы — Attach, прекратить отладку без завершения отлаживаемой программы — Detach, завершить отлаживаемую программу — Terminate, завершить и начать отладку заново — Restart, „остановить здесь“ — Run to Cursor (по меньшей мере в Visual Studio).
2. При пошаговой отладке удобно, когда каретка устанавливается на текущую инструкцию. И отдельно удобно иметь команду вернуть каретку к текущей инструкции (часто бывает надо куда-то уйти что-то посмотреть) — Show Next Statement.
3. Step in, Step over и Step out должны сразу же остановиться. При этом желательно, чтобы шагать не строками, а инструкциями (в Си/Си++ такого нет по историческим причинам, и это зачастую очень неудобно).
4. В выборе умолчательных кнопкосочетаний лучше придерживаться какого-то заявленного популярного образца (например, та же Visual Studio), а не делать самопальную амальгаму.
Re: Отладка в ZeroBrane Studio
Posted: Thu 13 Feb, 2014 22:38
by John Doe
Набор макросов, позволяющих управлять отладкой прямо из фара.
Клавиатурные сочетания аналогичны имеющимся в IDE (кроме CtrlF5 и AltF5).
Большая часть макросов предназначена для редактора в котором открыт *.lua скрипт.
AltF5 и ShiftF9 - исключение, они для области Common (только во время отладки).
CtrlF5 - разрешить/запретить отладку корутин.
Необходимо для того, чтобы отлаживать макросы.
После изменения макросы будут перезагружены.
Альтернатива: вручную добавить в макрос require"mobdebug".on()
F5 - подключиться к отладчику (начать отладку), require"mobdebug".start()
ShiftF5 - отключиться от отладчика (завершить отладку), require"mobdebug".done()
AltF5 - (временно) выключить/включить отладку не отключаясь от отладчика, require"mobdebug".off().
Может быть полезно, т.к. отладка существенно замедляет выполнение кода.
ShiftF9 - прервать выполнение текущего скрипта и перейти в IDE.
Внимание: для работы F9 и ShiftF9 важно чтобы папка проекта ZBS.projectroot (устанавливаемая в _macroinit.lua) совпадала с той, что назначена в IDE.
F9 - установить/снять точку останова.
Точки останова можно менять в любой момент, но работают (естественно) только во время отладки.
Внимание: точки установленные/снятые в редакторе фара (пока?) не отображаются в IDE.
Данный фрагмент необходимо использовать вместо того что приведён в шапке темы
> 2. При пошаговой отладке удобно, когда каретка устанавливается на текущую инструкцию.
Это так и есть.
> И отдельно удобно иметь команду вернуть каретку к текущей инструкции (часто бывает надо куда-то уйти что-то посмотреть) — Show Next Statement.
Этого пока нет, но идея интересная. В плагин, в плагин...
> 3. Step in, Step over и Step out должны сразу же остановиться. При этом желательно, чтобы шагать не строками, а инструкциями (в Си/Си++ такого нет по историческим причинам, и это зачастую очень неудобно).
Это регулируется самим Lua интерпретатором. Стандартный интерпретатор генерирует callback только по-строчно. LuaJIT генерирует по инструкциям.
> И ещё одно серьёзное неудобство: Step over (ShiftF10) и Step out (CtrlF10) не останавливают выполнение после выхода из текущей функции.
> Может такое поведение нормально?
В данном случае это видимо фича; пришлось еще попотеть чтобы ее правильно реализовать. Дело в том что скорее всего код функции находится в своей coroutine. Команды Step over/out действуют внутри той же самой coroutine где они выполнены. Это сделано для того чтобы управление не бросало когда происходит yield/resume, а только когда есть return из функции. Step in всегда останавливается на следующей команде (в какой-бы coroutine она не была).
> Как запустить отладку с использованием ZeroBrane Studio, пошаговая инструкция
Хорошая инструкция! Один пункт я бы упростил. Вместо копирования файлов в пункте 3 можно просто на них сослаться, установив LUA_PATH и LUA_CPATH переменные окружения как описано здесь: http://studio.zerobrane.com/doc-remote- ... _debugging
Re: Отладка в ZeroBrane Studio
Posted: Fri 14 Feb, 2014 12:10
by John Doe
paulclinger wrote:
2. При пошаговой отладке удобно, когда каретка устанавливается на текущую инструкцию.
Это так и есть.
Не совсем.
Текущая инструкция конечно же обозначается, но курсор остаётся в начале файла (или в месте последнего редактирования).
Что действительно делается, так это окно скроллируется к текущей инструкции, и то почему-то не всегда.
Закономерность пока не выявил, возможно сбой может происходить в случае когда срабатывает точка останова назначенная не в IDE (но не всегда)
paulclinger wrote:В данном случае это видимо фича;
Как-то обойти бы эту фичу, сильно мешает.
paulclinger wrote:Один пункт я бы упростил
Тогда придётся рассказывать где и как нужно устанавливать переменные, и никакого упрощения не получится )
Поначалу я хотел упомянуть о package.path/cpath, но отказался в пользу простого копирования.
В конце концов это неважно (а кому важно тот наверняка и без нас знает как обращаться с модулями)