Debugger

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
11 года 8 мес. назад - 11 года 4 мес. назад #72651 от Iren_Rin
Iren_Rin создал тему: Debugger
В общем немного поиска, немного усилий и мне удалось написать приемлемый дебаггер, который я и собираюсь использовать дальше (а значит и буду поддерживать пока он мне нужен). Возможно вы ожидали другого - тогда пишите, но именно такое чудо я подразумеваю когда говорю "дебаггер".
Сразу расскажу немного о принципе - руби со своим метопрограммированием на голову выше всех языков, с которыми я сталкивался. В основе дебаггера две вещи - binding и eval.
Binding - это считай окружение, он содержит все все все переменные, методы, константы конкретного участка кода. Грубо говоря, находясь в класс Actor на xxx сточке, в методе, в цикле, в блоке вы можете вызвать binding который будет слепком этого самого места. (Я бы наверное сам бы не понял, если бы не знал что такое binding и прочитал такое объяснение, но лучше я не могу :( Просто попользуйтесь дебаггером и все поймете)
Kernel#eval - метод, позволяющий исполнить строку, как будто в ней код.
Code:
eval("1 + 1") #=> 2
Будьте осторожный с этим методом. Я надеюсь, что вы не попытаетесь через дебаггер снести себе папки на диске C.
Код можно скачать перейдя по этой длинной ссылке . Он пока что плохо прокомментирован, буду исправлять в процессе использования.
Как пользоваться дебаггером:
1) создайте папку lib (или как хотите назовите) в проекте
2) загрузите туда все файлы дебаггера
3) вставте этот скрипт в проект (или прочитайте статью про внешние гемы и напишите свой, только учтите что этот скрипт загрузит консоль и в проекте, в пути к которому есть не ASCII символы) желательно до всех ваших скриптов.
ВНИМАНИЕ: Спойлер!

4) В игре [strike](в битве пока что не работает)[/strike] уже работает, с запущенной консолью нажимаем F5 - в консоли появится приветствие. Вы можете исполнить любой руби код в контексте приложения.
Code:
debug console activated, version 0.0.1 > 1 + 1 => 2 > RPG.constants => [:Map, :MapInfo, :Event ....
5) В своих скриптах в любом месте вставляем
Code:
Debugger.load_console(binding)
6) Когда скрипт будет исполняться в этом месте - в консоли опять появится приветствие и возможность выполнить любой руби код в контексте именно этого места
Code:
def say a = 1 b = 2 c = 3 Debugger.load_console binding end #когда запустится этот метод debug console activated, version 0.0.1 > a => 1 > b => 2 > c => 3
7) Хотим выйти - пишем exit (фокус переключится на игровое окошко)
8) Немножко кастылей. Консоль поддерижвает мультистрочность команд, т.е. это будет работать:
Code:
> arr = [1, 2, * 3, * 4] => [1, 2, 3, 4] > arr.length => 4
Но если мы допустим ошибку в синтаксисе в середине, консоль не выкинет нам SyntaxError, а будет продолжать запрашивать команды, пытаясь достроить код до чего путного.
Code:
> arr = [1, 2, * 3 #=> пропустили запятую * 4, * 5 #=> и так можно до бесконечности
чтобы выйти из этой ситуации наберите clear_eval

И напоследок - баги точно будут, ошибки - тоже будут, считайте что это альфа версия. Пишите сюда о ошибках, или что вам нравится \ не нравится, буду дописывать. Всем удачи!
Последнее редактирование: 11 года 4 мес. назад пользователем Iren_Rin.
Спасибо сказали: Seibur, Ren310, strelokhalfer, Lipton, Jas6666, KageDesu

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 8 мес. назад #72658 от DeadElf79
DeadElf79 ответил в теме Debugger
Ссылка на код уж больно незаметна среди всего остального текста.

Я пишу скрипты на другой версии мейкера, в которой консоли нет. Можно ли как-то модифицировать код, чтобы вывод информации производился в какой-нибудь файл лога? Без eval переживу, а вот binding заинтересовал и хотелось бы выводить его в файл.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
11 года 8 мес. назад #72664 от Iren_Rin
Iren_Rin ответил в теме Debugger
С биндингом тебе не удобно будет работать из файла, но вообще да - можно.
Я заюзал win32api для того чтобы получить доступ к окошку консоли игры (потому что оно уже было и туда идет STDOUT), теоретически я могу и новое окошко создать, независимое от игры вообще. Будут пробовать, отпишу о результатах.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 8 мес. назад #72665 от DeadElf79
DeadElf79 ответил в теме Debugger
Notepad++ поддерживает перезагрузку файлов, если они были модифицированы, я могу пользоваться им, чтобы проверять значения переменных в данном конкретном методе (если я правильно понимаю, как работает дебаггер).
К сожалению, подключение аналогичного окошка к XP приводит к перегрузке стека (имеется ввиду Console Script от ForeverZer0), так что я как раз на файлы рассчитываю.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Организатор конкурсов 2 место
Больше
11 года 8 мес. назад #72667 от Lipton
Lipton ответил в теме Debugger
В моем случае, что бы нормально заработал проект с этим скриптом, потребовалось изменить путь к проекту, то есть что бы в пути не было русских букв. Иначе при старте вываливалось с ошибкой кодировки.

Первое что ввел в консоли "help" =))))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 8 мес. назад #72668 от DeadElf79
DeadElf79 ответил в теме Debugger
Кстати, в руби-то это можно сделать, но вот в мейкерском руби не пробовал - можно ли использовать Encoding?) Было бы весьма удобно.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
11 года 8 мес. назад #72670 от Iren_Rin
Iren_Rin ответил в теме Debugger

Lipton пишет: В моем случае, что бы нормально заработал проект с этим скриптом, потребовалось изменить путь к проекту, то есть что бы в пути не было русских букв. Иначе при старте вываливалось с ошибкой кодировки.

Первое что ввел в консоли "help" =))))

К сожалению это не irb и команды help тут нет (да и в irb она особо мало чем может помочь), пиши лучше сюда что именно тебе нужно?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 8 мес. назад #72671 от DeadElf79
DeadElf79 ответил в теме Debugger
Не-не, тут вряд ли есть какой-то вопрос, help в консоли - это вполне себе типичное начало работы с любым консольным приложением) Я бы даже сказал, что это самое правильное начало))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
11 года 8 мес. назад - 11 года 8 мес. назад #72672 от Iren_Rin
Iren_Rin ответил в теме Debugger

DeadElf79 пишет: Кстати, в руби-то это можно сделать, но вот в мейкерском руби не пробовал - можно ли использовать Encoding?) Было бы весьма удобно.

Заглянул в документацию руби по классу Encoding , задумался. Ты уверен что тебе нужно использовать этот класс или мне нужно просто пофиксить баг с кирилицей в пути к проекту?
Я просто юзаю в основном Ubuntu для работы (там всегда unicode), и почти всегда именую папку латницей, так что даже и не подумал про такие возможные проблемы, сори. Как доберусь домой - разберусь :)
Последнее редактирование: 11 года 8 мес. назад пользователем Iren_Rin.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 8 мес. назад #72673 от DeadElf79
DeadElf79 ответил в теме Debugger
Только для бага с кириллицей, конечно) Винда еще не перешла на юникод, к сожалению)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
11 года 8 мес. назад - 11 года 8 мес. назад #72674 от DeadElf79
DeadElf79 ответил в теме Debugger
  • в каком случае меняется "=>" на " * "?
    [IMG

  • дебаггер не перезапускается после выхода из него(нужно было выделить окно с игрой, да)
  • если находиться в консоли после выхода из дебаггера и заново запустить его, то в строке ввода появляются все символы, которые ты вводил "вслепую", пока дебаггер был выключен О.о
  • немного странный вывод результатов
    [IMG
  • Последнее редактирование: 11 года 8 мес. назад пользователем DeadElf79.
    Спасибо сказали: Iren_Rin

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Организатор конкурсов 2 место
    Больше
    11 года 8 мес. назад #72677 от Lipton
    Lipton ответил в теме Debugger
    По поводу кириллицы. Такой баг только на XP дома на 7 все нормуль, там изначально папки родные, а кирилицей только ссылки на них.

    * - как я понял это не до конца введенная команда.
    clear_eval меня спасает. =)

    А так работает не плохо. Можно посмотреть содержимое всяких переменных и даже что-нибудь изменить на лету.
    Хотелось бы видеть точку входу, при входе по брейк поинту. Что нибудь в стиле "Input class Game_Message def all_text" не знаю реально ли это. =)))
    Спасибо сказали: Iren_Rin

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
    Больше
    11 года 8 мес. назад - 11 года 8 мес. назад #72678 от Iren_Rin
    Iren_Rin ответил в теме Debugger
    Немного по промптам дебагера:
    Prompt - это приглашение консоли ввести что нибудь.
    > - означает "введите руби код который я с радостью для вас иполню"
    Юзер вводит рубикод, он исполняется, результат возращается с символом => (это общепринятое обозначения для результата в руби)
    Code:
    > 1 + 1 => 2 #результат сложения >
    * - означает "вы ввели уже какой то код, но я не могу его исполнить без ошибок, пожалуйста, закончите его"
    Как это работает, юзер вводит что то типа
    Code:
    > arr = [1,2,3, *
    Дебаггер берет строку "arr = [1,2,3" и пытается ее исполнить, это конечно же неполная руби строка, возникает ошибка SyntaxError. Дебаггер ловит ее, сохраняет предыдущий ввод (строку "arr = [1,2,3") у себя внутри и выводит promt "*"
    Юзер дописывает:
    Code:
    * 4, 5, 6] => [1,2,3,4,5,6]
    Дебаггер берет эту новую строчку ("4,5,6]") присоеденяет ее к сохраненной - получается ("arr = [1,2,3,4,5,6]") и исполняет ее без ошибок. Все довольны). Зачем это нужно? Чтобы не писать длинный код в дебаггере в одну строку:
    Code:
    > hash = { * 'a' => 1, 'b' => 2, * 'c' => 3, * 'd' => 4 * } => {'a'=>1,'b'=>2,'c'=>3,'d'=>4}
    Чем за это приходится платить? Как я уже писал выше, если вы допустите ошибку скажем в третей строке, кторую ввели в дебагер, не заметите этого, то вы уже не сможете ее исправить. Более того дебаггер будет у вас слезно просить все новые и новые строчки кода, чтобы не было SyntaxError. Введите команду clear_eval чтобы очистить то, что вы уже написали. Пример:
    Code:
    > arr = [1,2, * 3, 4 #тут я забыл добавить запятую после 4, теперь дебаггер никогда не сможет достроить этот массив до целого * 5, * 'plz stop *', * 'ну пожалста прекрати мне выводить *' #ничего не поможет, ведь SyntaxError возникает снова и снова * clear_eval > #ну наконец то, дебаггер очистил то что я уже написал, теперь я могу ввести правильный массив
    Последний пример - костыль конечно, но увы, без него пока что никак.
    Последнее редактирование: 11 года 8 мес. назад пользователем Iren_Rin.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
    Больше
    11 года 8 мес. назад - 11 года 8 мес. назад #72679 от Iren_Rin
    Iren_Rin ответил в теме Debugger

    DeadElf79 пишет: дебаггер не перезапускается после выхода из него(нужно было выделить окно с игрой, да)

    Дебаггер должен сам переводить фокус на окно с игрой, после ввода команды exit. Если он так не делает - это баг :(
    Последнее редактирование: 11 года 8 мес. назад пользователем Iren_Rin.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
    Больше
    11 года 8 мес. назад #72680 от Iren_Rin
    Iren_Rin ответил в теме Debugger

    DeadElf79 пишет: если находиться в консоли после выхода из дебаггера и заново запустить его, то в строке ввода появляются все символы, которые ты вводил "вслепую", пока дебаггер был выключен О.о

    Ого)) видимо ты и исполнять код вслепую сможешь, нужно добавить переключатель внутри вкл \ выкл :)

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
    Больше
    11 года 8 мес. назад #72682 от Iren_Rin
    Iren_Rin ответил в теме Debugger

    DeadElf79 пишет: немного странный вывод результатов

    Все правильно, в руби любое выражение что то да возращает
    Code:
    > a = puts 'hello' #Метод puts выводит строку на STDOUT, который в нашем случае - дебаггер 'Hello' #Это результат работы метода puts => #выражение puts 'Hello' в итоге вернет nil, который мы тут и видим (nil кстати сохранится в а) > a.nil? => true

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
    Больше
    11 года 8 мес. назад #72683 от Iren_Rin
    Iren_Rin ответил в теме Debugger

    Lipton пишет: Что нибудь в стиле "Input class Game_Message def all_text" не знаю реально ли это. =)))

    Сделаю имя файла и номер строки.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
    Больше
    11 года 8 мес. назад #72686 от DeadElf79
    DeadElf79 ответил в теме Debugger
  • есть вариант при пропуске запятой в конце строки добавлять новую строку, заменяя символ переноса строки на пустое место или запятую.
  • исполнение кода вслепую? оригинально, но баг, да)
  • насчет возврата - спасибо, не знал)
  • Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
    Больше
    11 года 8 мес. назад - 11 года 8 мес. назад #72688 от Iren_Rin
    Iren_Rin ответил в теме Debugger
    Массивы я взял для примера, что ты скажем сделаешь с
    Code:
    > class Dog * attr_reader :name * def initialize(name) * @name = name * end * end > > bob = Dog.new 'bob' > bob.name => bob
    Последнее редактирование: 11 года 8 мес. назад пользователем Iren_Rin.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
    Больше
    11 года 8 мес. назад #72689 от DeadElf79
    DeadElf79 ответил в теме Debugger
    анализировать состав строки, если там что-то похожее на массив - почему бы и не сделать что-то типа того, что я сказал?)
    ладно, это сложно и не нужно, согласен. лучше придумать другой выход из этой ошибки.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Время создания страницы: 0.129 секунд
    Работает на Kunena форум