Как масштабировать стек при отладке с помощью byebug?

В настоящее время я получаю сообщение об ошибке, которое выглядит следующим образом:

NoMethodError: undefined method `debug' for nil:NilClass
    /mnt/hgfs/Dropbox/Company/Project/lib/project/misc.rb:23:in `debug'
    /mnt/hgfs/Dropbox/Company/Project/lib/project/validation/google_geocoding_validation_engine.rb:49:in `block in compare_addresses'
    /mnt/hgfs/Dropbox/Company/Project/lib/project/validation/google_geocoding_validation_engine.rb:43:in `each'
    /mnt/hgfs/Dropbox/Company/Project/lib/project/validation/google_geocoding_validation_engine.rb:43:in `compare_addresses'
    /mnt/hgfs/Dropbox/Company/Project/lib/project/validation/google_geocoding_validation_engine.rb:32:in `valid?'
    /mnt/hgfs/Dropbox/Company/Project/specs/project/validation/google_geocoding_validation_engine_spec.rb:56:in `block (2 levels) in <module:Validation>'
    /home/tomas/ruby2/lib/ruby/2.0.0/minitest/unit.rb:1301:in `run'

Я решил попробовать использовать byebug, чтобы выяснить, почему объект nil, поскольку он никогда не должен быть nil. Я поставил byebug чуть выше ошибочной строки:

def debug(&block)
  if @logger.nil?
    byebug
  end

  @logger.debug(@logger_name, &block)
end

И провел тесты. Я попал в интерфейс отладки byebug и смог подтвердить, что объект действительно был nil. Проблема в том, что я не могу подняться по стеку:

(byebug) up
*** Adjusting would put us beyond the oldest (initial) frame.
(byebug) down
*** Adjusting would put us beyond the newest (innermost) frame.
(byebug) backtrace
--> #0  AddressKit::Misc::Logging.debug(block#Proc) at /mnt/hgfs/Dropbox/Kvantel/Address Kit/lib/addresskit/misc.rb:25
Warning: saved frames may be incomplete; compare with caller(0)

Почему я не могу подняться по стеку? Это проблема с byebug или, возможно, несовместимость с MiniTest?


person Hubro    schedule 11.06.2013    source источник


Ответы (1)


Ответ для byebug >= 1.5.0

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

Ответ для byebug ‹ 1.5.0 (также применимо к отладчику или ruby-debug)

Byebug не начнет отслеживать информацию о стеке вызовов, пока не будет вызвана Byebug.start, которая внутренне вызывается командой byebug. Таким образом, к тому времени, когда вы получите приглашение отладки, будет сохранен только один кадр стека вызовов, поэтому вы получите это сообщение:

Warning: saved frames may be incomplete; compare with caller(0)

и именно поэтому вы не можете переместить up или down: есть только один кадр.

Чтобы правильно перемещаться по стеку, вам нужно запустить Byebug выше, перетащив Byebug.start туда, где вы хотите начать отслеживать информацию о стеке вызовов. Например, перед строкой 56 в google_geocoding_validation_engine_spec.rb. Если вам нужна полная информация о стеке, вы можете запустить byebug с самого начала, запустив исполняемый файл byebug:

byebug rake

или, тем не менее, вы используете свои спецификации.

Если у вас все еще есть проблемы, пожалуйста, дайте мне знать!

Надеюсь это поможет.

person deivid    schedule 14.06.2013
comment
Это сработало, но теперь я получаю сообщение об ошибке при попытке перечислить обратную трассировку. В моем случае, когда byebug пытается описать строку №2 стека, он завершается с ошибкой со следующим текстом: ВНУТРЕННЯЯ ОШИБКА!!! нет неявного преобразования nil в String. Ошибка в byebug/processor.rb:78 в initialize. Это означает, что каждый раз, когда я использую команду backtrace или повторяю команду up, пока не достигну определенного кадра стека, отладчик печатает ошибку и сбрасывает до самого глубокого кадра. Довольно раздражает. Я включаю эту информацию, так как у меня сложилось впечатление, что вы являетесь соавтором (или автором) byebug. - person Hubro; 15.06.2013
comment
Да. Не могли бы вы открыть задачу здесь? Надеюсь, я смогу воспроизвести ошибку самостоятельно и исправить ее. Спасибо! - person deivid; 15.06.2013