Войти на сайт

Авторизация, ждите ...
×
  • Страница:
  • 1
  • 2

ТЕМА: Debugger

Debugger 9 года 7 мес. назад #72651

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

4) В игре (в битве пока что не работает) уже работает, с запущенной консолью нажимаем F5 - в консоли появится приветствие. Вы можете исполнить любой руби код в контексте приложения.
debug console activated, version 0.0.1
> 1 + 1
=> 2
> RPG.constants
=> [:Map, :MapInfo, :Event ....
5) В своих скриптах в любом месте вставляем
Debugger.load_console(binding)
6) Когда скрипт будет исполняться в этом месте - в консоли опять появится приветствие и возможность выполнить любой руби код в контексте именно этого места
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) Немножко кастылей. Консоль поддерижвает мультистрочность команд, т.е. это будет работать:
> arr = [1, 2,
* 3,
* 4]
=> [1, 2, 3, 4]
> arr.length
=> 4
Но если мы допустим ошибку в синтаксисе в середине, консоль не выкинет нам SyntaxError, а будет продолжать запрашивать команды, пытаясь достроить код до чего путного.
> arr = [1, 2,
* 3 #=> пропустили запятую
* 4,
* 5 #=> и так можно до бесконечности
чтобы выйти из этой ситуации наберите clear_eval

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

Debugger 9 года 7 мес. назад #72658

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
Ссылка на код уж больно незаметна среди всего остального текста.

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

Debugger 9 года 7 мес. назад #72664

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
С биндингом тебе не удобно будет работать из файла, но вообще да - можно.
Я заюзал win32api для того чтобы получить доступ к окошку консоли игры (потому что оно уже было и туда идет STDOUT), теоретически я могу и новое окошко создать, независимое от игры вообще. Будут пробовать, отпишу о результатах.
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72665

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
Notepad++ поддерживает перезагрузку файлов, если они были модифицированы, я могу пользоваться им, чтобы проверять значения переменных в данном конкретном методе (если я правильно понимаю, как работает дебаггер).
К сожалению, подключение аналогичного окошка к XP приводит к перегрузке стека (имеется ввиду Console Script от ForeverZer0), так что я как раз на файлы рассчитываю.
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72667

  • Lipton
  • Lipton аватар
  • Вне сайта
  • Просветлённый
  • Ух ты!
  • Сообщений: 379
  • Спасибо получено: 670
  • Организатор конкурсовПрограммист Ruby2 место
В моем случае, что бы нормально заработал проект с этим скриптом, потребовалось изменить путь к проекту, то есть что бы в пути не было русских букв. Иначе при старте вываливалось с ошибкой кодировки.

Первое что ввел в консоли "help" =))))
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72668

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
Кстати, в руби-то это можно сделать, но вот в мейкерском руби не пробовал - можно ли использовать Encoding?) Было бы весьма удобно.
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72670

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
Lipton пишет:
В моем случае, что бы нормально заработал проект с этим скриптом, потребовалось изменить путь к проекту, то есть что бы в пути не было русских букв. Иначе при старте вываливалось с ошибкой кодировки.

Первое что ввел в консоли "help" =))))
К сожалению это не irb и команды help тут нет (да и в irb она особо мало чем может помочь), пиши лучше сюда что именно тебе нужно?
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72671

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
Не-не, тут вряд ли есть какой-то вопрос, help в консоли - это вполне себе типичное начало работы с любым консольным приложением) Я бы даже сказал, что это самое правильное начало))
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72672

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
DeadElf79 пишет:
Кстати, в руби-то это можно сделать, но вот в мейкерском руби не пробовал - можно ли использовать Encoding?) Было бы весьма удобно.
Заглянул в документацию руби по классу Encoding, задумался. Ты уверен что тебе нужно использовать этот класс или мне нужно просто пофиксить баг с кирилицей в пути к проекту?
Я просто юзаю в основном Ubuntu для работы (там всегда unicode), и почти всегда именую папку латницей, так что даже и не подумал про такие возможные проблемы, сори. Как доберусь домой - разберусь :)
Последнее редактирование: 9 года 7 мес. назад от Iren_Rin.
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72673

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
Только для бага с кириллицей, конечно) Винда еще не перешла на юникод, к сожалению)
Администратор запретил публиковать записи гостям.

Debugger 9 года 7 мес. назад #72674

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
  • в каком случае меняется "=>" на " * "?

  • дебаггер не перезапускается после выхода из него(нужно было выделить окно с игрой, да)
  • если находиться в консоли после выхода из дебаггера и заново запустить его, то в строке ввода появляются все символы, которые ты вводил "вслепую", пока дебаггер был выключен О.о
  • немного странный вывод результатов
  • Последнее редактирование: 9 года 7 мес. назад от DeadElf79.
    Администратор запретил публиковать записи гостям.
    За этот пост поблагодарили: Iren_Rin

    Debugger 9 года 7 мес. назад #72677

    • Lipton
    • Lipton аватар
    • Вне сайта
    • Просветлённый
    • Ух ты!
    • Сообщений: 379
    • Спасибо получено: 670
    • Организатор конкурсовПрограммист Ruby2 место
    По поводу кириллицы. Такой баг только на XP дома на 7 все нормуль, там изначально папки родные, а кирилицей только ссылки на них.

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

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

    Debugger 9 года 7 мес. назад #72678

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

    Debugger 9 года 7 мес. назад #72679

    • Iren_Rin
    • Iren_Rin аватар
    • Вне сайта
    • Мастер
    • Сообщений: 247
    • Спасибо получено: 537
    • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
    DeadElf79 пишет:
    дебаггер не перезапускается после выхода из него(нужно было выделить окно с игрой, да)
    Дебаггер должен сам переводить фокус на окно с игрой, после ввода команды exit. Если он так не делает - это баг :(
    Последнее редактирование: 9 года 7 мес. назад от Iren_Rin.
    Администратор запретил публиковать записи гостям.

    Debugger 9 года 7 мес. назад #72680

    • Iren_Rin
    • Iren_Rin аватар
    • Вне сайта
    • Мастер
    • Сообщений: 247
    • Спасибо получено: 537
    • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
    DeadElf79 пишет:
    если находиться в консоли после выхода из дебаггера и заново запустить его, то в строке ввода появляются все символы, которые ты вводил "вслепую", пока дебаггер был выключен О.о
    Ого)) видимо ты и исполнять код вслепую сможешь, нужно добавить переключатель внутри вкл \ выкл :)
    Администратор запретил публиковать записи гостям.

    Debugger 9 года 7 мес. назад #72682

    • Iren_Rin
    • Iren_Rin аватар
    • Вне сайта
    • Мастер
    • Сообщений: 247
    • Спасибо получено: 537
    • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
    DeadElf79 пишет:
    немного странный вывод результатов
    Все правильно, в руби любое выражение что то да возращает
    > a = puts 'hello' #Метод puts выводит строку на STDOUT, который в нашем случае - дебаггер
    'Hello'        #Это результат работы метода puts
    =>             #выражение puts 'Hello' в итоге вернет nil, который мы тут и видим (nil кстати сохранится в а)
    > a.nil?     
    => true
    Администратор запретил публиковать записи гостям.

    Debugger 9 года 7 мес. назад #72683

    • Iren_Rin
    • Iren_Rin аватар
    • Вне сайта
    • Мастер
    • Сообщений: 247
    • Спасибо получено: 537
    • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
    Lipton пишет:
    Что нибудь в стиле "Input class Game_Message def all_text" не знаю реально ли это. =)))
    Сделаю имя файла и номер строки.
    Администратор запретил публиковать записи гостям.

    Debugger 9 года 7 мес. назад #72686

    • DeadElf79
    • DeadElf79 аватар
    • Вне сайта
    • Звездный Страж
    • Сообщений: 3147
    • Спасибо получено: 2650
    • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
  • есть вариант при пропуске запятой в конце строки добавлять новую строку, заменяя символ переноса строки на пустое место или запятую.
  • исполнение кода вслепую? оригинально, но баг, да)
  • насчет возврата - спасибо, не знал)
  • Администратор запретил публиковать записи гостям.

    Debugger 9 года 7 мес. назад #72688

    • Iren_Rin
    • Iren_Rin аватар
    • Вне сайта
    • Мастер
    • Сообщений: 247
    • Спасибо получено: 537
    • УчительПрограммист RubyПроект года 1 местоКоммерсантПроект месяца 1 место
    Массивы я взял для примера, что ты скажем сделаешь с
    > class Dog
    *   attr_reader :name
    *   def initialize(name)
    *     @name = name
    *   end
    * end
    >
    > bob = Dog.new 'bob'
    > bob.name
    => bob
    Последнее редактирование: 9 года 7 мес. назад от Iren_Rin.
    Администратор запретил публиковать записи гостям.

    Debugger 9 года 7 мес. назад #72689

    • DeadElf79
    • DeadElf79 аватар
    • Вне сайта
    • Звездный Страж
    • Сообщений: 3147
    • Спасибо получено: 2650
    • Писатель 3 место3 местоПроект месяца 1 местоПроект месяца 2 местоОрганизатор конкурсов1 место в ГотвВетеранУчительПрограммист Ruby
    анализировать состав строки, если там что-то похожее на массив - почему бы и не сделать что-то типа того, что я сказал?)
    ладно, это сложно и не нужно, согласен. лучше придумать другой выход из этой ошибки.
    Администратор запретил публиковать записи гостям.
    • Страница:
    • 1
    • 2
    Время создания страницы: 0.716 секунд