logo
Программирование на языке Ruby

16.4. Использование irb в качестве отладчика

Библиотеку ruby-breakpoint написал Флориан Гросс (Florian Gross). Этот великолепный, несмотря на малый объем, инструмент позволяет расставлять в программе точки прерывания методомbreakpoint. Когда в процессе исполнения встречается точка прерывания, запускается сеанс irb (программа интерактивной работы с Ruby irb подробно рассматривается в главе 21).

Эта библиотека не входит в стандартный дистрибутив. Установить ее можно, например, выполнив команду gem install ruby-breakpoint.

Внесем несколько изменений в программу из листинга 16.4. Поместим в начало директиву require 'breakpoint' и добавим вызов метода breakpoint после обоих обращений к gets:

require 'breakpoint'

# ...

w2 = gets.chomp

breakpoint

# ...

Теперь запустим ее. В следующем протоколе сеанса показано, как мы входим в irb, после чего можем делать все что угодно — в частности, вызывать ранее определенные методы и изменять значения переменных.

$ ruby myprog.rb

Give me a word: parental

Give me another word: prenatal

Executing break point at myprog.rb:23

irb(main):001:0> w1

=> "parental"

irb(main):002:0> w2

=> "prenatal"

irb(main):003:0> palindrome?(w1)

=> false

irb(main):004:0> palindrome?("detartrated")

=> true

irb(main):005:0> signature(w1)

=> "aaelnprt"

irb(main):006:0> quit

'parental' is not a palindrome.

'prenatal' is not a palindrome.

'parental' and 'prenatal' are anagrams.

Особенно подкупает, что отлаживаемая программа может быть не только командной или текстовой. Существует клиент drb (распределенный Ruby), который позволяет удаленно отлаживать программу Ruby, работающую в другом процессе.

Чтобы воспользоваться этой возможностью, нужно включить вызов следующего метода в отлаживаемую программу (естественно, до первого обращения к методу breakpoint):

Breakpoint.activate_drb("druby://127.0.0.1:2001", "localhost")

# Запустить сервер на порту 2001 машины localhost.

Запустите клиент командой breakpoint_client. Каждые три секунды он будет пытаться установить соединение с сервером, пока это не получится или вы не завершите его принудительно.

$ breakpoint_client druby://localhost:2001

No connection to breakpoint service at druby://localhost:2001 (DRb::DRbConnError)

Tries to connect will be made every 3 seconds...

После установления соединения вы можете и не получить приглашение irb. Программа будет выполняться до точки прерывания — вот тогда-то вы и увидите приглашение.

Дополнительную информацию об этой библиотеке поищите в документации, которая входит в комплект поставки.