使用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 ' /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不兼容?

对于byebug> = 1.5.0的回答

在像这样的情况下打印和移动callstack应该只是工作 ,OP不会有这个问题。

回答byebug <1.5.0(也适用于调试器或ruby-debug)

在调用Byebug.start之前, Byebug.start不会开始跟踪callstack信息,这是由byebug命令在内部调用的。 因此,当您收到调试提示时,只保存了一个callstack框架,这就是您收到该消息的原因:

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

这就是你不能上下移动的原因:只有一个框架。

要正确导航堆栈,您需要通过将Byebug.start任何想要开始跟踪callstack信息的位置来启动Byebug.start 。 例如,在google_geocoding_validation_engine_spec.rb第56行之前。 如果您想要完整的堆栈信息,可以通过运行byebug可执行文件从一开始就运行byebug:

 byebug rake 

或者你运行你的规格。

如果您还有问题,请告诉我们!

希望这可以帮助。