Page 3 of 9

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

Posted: Wed 12 Feb, 2014 22:52
by paulclinger

Latest post of the previous page:

> Всё работает, в IDE останавливается где положено.
> Однако визуально изменения не отображаются, т.е. новые точки не отображаются, а старые не убираются.

Да, обмен данными о точках останова идет в одну сторону, от IDE к приложению. Это было бы наверное интересно рапортовать текущий список после остановки, но пока никакой потребности на было, поскольку точки останова контролировались самим IDE. Подумаю над механизмом...

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

Posted: Wed 12 Feb, 2014 23:03
by John Doe


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:но это не большая проблема
Знаю, это во мне перфекционизм играет )
Поэтому себе уже сделал восстановление

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

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

Posted: Thu 13 Feb, 2014 08:53
by John Doe
paulclinger wrote:
Была бы удобна команда соответствующая функции IDE ShiftF9 - Break execution at the next executed line of code
Это интересная идея. Вроде как 'остановить здесь'. Надо подумать как реализовать.
Пока что заменил установкой breakpoint:

Code: Select all

    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) не останавливают выполнение после выхода из текущей функции.

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

Posted: Thu 13 Feb, 2014 09:53
by John Doe
Как запустить отладку с использованием ZeroBrane Studio, пошаговая инструкция

Приглашаю заинтересованных проверить ничего ли я не упустил.
Половину пунктов как следует не тестировал, поскольку в моей конфигурации всё несколько иначе (напр. пункт 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



Update: новая версия тут: http://forum.farmanager.com/viewtopic.p ... 04#p117004

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

Posted: Fri 14 Feb, 2014 08:22
by paulclinger
> 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, но отказался в пользу простого копирования.
В конце концов это неважно (а кому важно тот наверняка и без нас знает как обращаться с модулями)