Как программно вызвать отладчик ruby ​​из программы ruby ​​в Ruby 1.9? - PullRequest
3 голосов
/ 12 ноября 2009

Я пишу веб-отладчик для Ruby, но для этого мне нужно иметь возможность вызывать отладчик Ruby из программы Ruby на стороне сервера. Это когда-нибудь было сделано? Это вообще возможно?

Готовый конечный продукт позволит редактировать, выполнять и выполнять код Ruby, используя только веб-браузер. Код ruby, который должен быть отлажен, будет «вычисляться» на стороне сервера.

С тех пор один из пользователей stackoverflow указал в правильном направлении, который предложил использовать popen или ожидаемо. Я попробовал оба из них сейчас, но столкнулся со следующими проблемами:

popen: при ожидании консоли вы должны использовать блок тайм-аута, чтобы сообщить об окончании вывода консоли отладки (терминал командной строки может обнаружить это, так почему не может ruby).

Ожидайте: В программе ниже входы отладчика не синхронизированы с отладчиком. Почему это так?

require 'pty'
require 'expect'

$expect_verbose = true
PTY.spawn("rdebug deb.rb") do |from_debugger, to_debugger, pid|

    a=nil

    while ( a != "end" ) do

        from_debugger.expect(/\(rdb:1\)/ ) do |input|

            a = gets
            to_debugger.puts( a + "\n" )

        end
        from_debugger.flush
    end

end

Ответы [ 2 ]

1 голос
/ 12 ноября 2009

Я думаю, вы могли бы использовать ruby-debug . Я хотел бы представить, что это открытие того же скрипта на стороне сервера и отправка на него нажатий клавиш. Я думаю, что так я и сделаю.

Думайте об этом так: клиент вставляет свой код в вашу форму. При желании он может нажать на кнопку, которая ставит точку останова на какой-либо строке. Затем он представляет все это. На стороне сервера вы обрабатываете эту форму и создаете файл .rb с содержимым формы. В строке, где он поставил точку останова, вы вставляете вызов debugger. Затем вы запускаете:

ruby client_script.rb

, и это остановит процесс, как только он достигнет строки debugger. Я бы посоветовал вам сделать все это с Expect для Ruby или чем-то еще. Таким образом, когда клиент нажимает step over на странице или проверяет какую-либо переменную, вы посылаете нажатия клавиш порожденному вами процессу. Например, если он хочет проверить значение переменной x, вы отправите это процессу:

p x

и вам нужно будет захватить этот вывод и отправить его обратно в браузер клиента. Expect вроде как popen, но немного лучше.

0 голосов
/ 17 ноября 2009

Я наконец-то понял, как это сделать, используя функцию ожидаемого:

require 'pty'
require 'expect'

PTY.spawn("rdebug deb.rb") do |output,input,pid|
    while true do
        begin    
            buffer = ""
            puts "-------"
            puts output.readpartial(1024,buffer) until buffer =~ /\(rdb:1\)/
            a = gets
            input.puts a
        rescue
            break
        end
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...