Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Debugging, какими средствами пользоваться


Автор: fell 28.7.2010, 11:34
Понадобилось давеча провести debugging одного файла. Конкретнее

http://github.com/rails/rails/blob/master/activesupport/lib/active_support/dependencies.rb
строка 457
trace = caller.reject {|l| l =~ %r{#{Regexp.escape(__FILE__)}}}
вот как бы добраться до переменной trace и посмотреть ее значение ?

обычно использую ruby -r debug file.rb. Но если ставить breakpoint в этом месте ( строка 457) то дебагер выкидывает. Пробовал через next и step добраться, дохожу до функции и перепрыгивает с одной функции на другую, в саму функцию не входит. Может есть какие то другие программулины, методы и способы ? посоветуйте...



Автор: source777 28.7.2010, 23:49
Цитата(fell @  28.7.2010,  11:34 Найти цитируемый пост)
Может есть какие то другие программулины, методы и способы ?

Ну способов масса, от банального puts trace.inspect в следующей строке, до навороченных IDE типа NetBeans и RubyMine.

P.S. один топик - один вопрос

Автор: fell 29.7.2010, 10:00
от навороченных IDE никого толку, они используют тот же debug... 
подскажите конкретно, как вывести значение переменной в примере ?

Автор: source777 31.7.2010, 17:18
Цитата(fell @  29.7.2010,  10:00 Найти цитируемый пост)
от навороченных IDE никого толку, они используют тот же debug... 

Просто тебе будет проще поставить брейкпоинт и посмотреть значения переменных. ruby-debug работает без проблем, но вот с консольным интерфейсом справляются далеко не все и ты тут не исключение.


Цитата(fell @  29.7.2010,  10:00 Найти цитируемый пост)
подскажите конкретно, как вывести значение переменной в примере ? 

puts trace.inspect из консоли отладчика
Другое дело, что отладчик может просто не дойти до нужной строки, а экстрасенсы все в отпуске... поэтому никто не знает, что именно ты пытаешься отдебажить и насколько сообразно этому запускаешь отладчик.
Кстати указанная в топике строка имеет номер 464, а не 457.

Автор: fell 31.7.2010, 19:09
да строка 464
Что я хотел увидеть, это значение переменной trace.  Я об этом писал в самом начале, причем тут экстрасенсы не очень понятно, может нужно немного внимательнее читать текст ....
Отладчик и не доходит до нужной точки, брекпойнт на это строку я выставлял, программа просто завершается и выкидывает в консоль. 

Автор: source777 2.8.2010, 14:30
Цитата(fell @  31.7.2010,  19:09 Найти цитируемый пост)
Я об этом писал в самом начале, причем тут экстрасенсы не очень понятно

А притом, что в твоих действиях есть причина почему отладчик не доходит до желаемой строки, однако действия эти известны только тебе и экстрасенсам.  smile 

Автор: fell 2.8.2010, 18:23
действия стандартные

ruby -r debug file.rb
list 1-644
b 464
c

и тут выкидывает в консоль.

По-моему цель вполне ясная, вывести значение переменной trace. Лучше бы показали как это можно сделать, если это возможно и каким способом это сделать.

Автор: bilbobagginz 3.8.2010, 22:41
fell, блоки я бы развернул на несколько строк.
разбил бы на промежопочные куски.

каждый { } на 
do |l|

end


Автор: source777 7.8.2010, 13:24
Цитата(fell @  2.8.2010,  18:23 Найти цитируемый пост)
ruby -r debug file.rb

Что за файл file.rb? Если ты пытаешься запустить отдельно сам dependencies.rb, то из этого ничего путного выйти не должно. Да и с какой стати я должен гадать, как ты там отлаживаешь, если ты сам этого рассказать не желаешь. Ты даже не написал с какой ошибкой вылетает отладчик.
А если под "вылетает" подразумевается завершает работу в штатном режиме, то значит поток управления просто ни разу не зашёл в функцию load_missing_constant. 

Цитата(fell @  2.8.2010,  18:23 Найти цитируемый пост)
По-моему цель вполне ясная, вывести значение переменной trace.

Да какая ж это нафиг цель? Это даже на полноценный шаг на пути к цели не тянет, т.е. либо ты сам не знаешь для чего тебе это надо, либо просто решил попридуриваться на форуме.

Так как от тебя не удалось выведать никакой информации о том, что ты делаешь. Придётся без объяснений и разбора ошибок рассказать как надо делать:
Раз уж тебе так нравится file.rb, то внутри у него должно быть нечто подобное
Код

require 'rubygems'
require 'active_support/dependencies'
ActiveSupport::Dependencies.load_missing_constant ActiveSupport, 'Missed'


Код

$ ruby -r debug file.rb
Debug.rb
Emacs support available.

file.rb:1:require 'rubygems'
(rdb:1) b /home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446
Set breakpoint 1 at /home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446
(rdb:1) c
Breakpoint 1, load_missing_constant at /home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446
/home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446:      name_error = NameError.new("uninitialized constant #{qualified_name}")
(rdb:1) puts trace.inspect
["file.rb:3:in `<main>'"]

Автор: fell 13.8.2010, 18:11
Цитата

Ты даже не написал с какой ошибкой вылетает отладчик.


товарищ эксперт, вы наверно после работы читаете форум, на работе сильно устаете и плохо соображаете...
я писал в предыдущем посте, что именно происходит и что я конкретно делаю. Да file.rb просто как пример привел, вместо file.rb был dependecies.rb.
О чем я писал вообще в начале топика. Придуриваться по таким серьезным вопросам вообще не имел ни какого желания. 

Код

file.rb:1:require 'rubygems'
(rdb:1) b /home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446
Set breakpoint 1 at /home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446
(rdb:1) c
Breakpoint 1, load_missing_constant at /home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446
/home/source777/.rvm/gems/ruby/1.9.1/gems/activesupport-3.0.0.beta3/lib/active_support/dependencies.rb:446:      name_error = NameError.new("uninitialized constant #{qualified_name}")
(rdb:1) puts trace.inspect
["file.rb:3:in `<main>'"]


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

Автор: source777 16.8.2010, 11:44
Цитата(fell @  13.8.2010,  18:11 Найти цитируемый пост)
Да file.rb просто как пример привел, вместо file.rb был dependecies.rb.
О чем я писал вообще в начале топика.

Неа, не писал. Ты написал, что хочешь поставить точку останова внутри dependecies.rb, но то что ты непосредственно его пытаешься запустить в отладчике про это не было ни слова. А догадаться о столь нелогичном действии ой как не просто smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)