From: "garysweaver (Gary Weaver)" Date: 2012-07-24T04:27:52+09:00 Subject: [ruby-core:46683] [ruby-trunk - Bug #6783] Infinite loop in inspect, not overriding inspect, to_s, and no known circular references. Stepping into inspect in debugger locks it up with 100% CPU. Issue #6783 has been updated by garysweaver (Gary Weaver). It was just a circular reference. Ruby does some level of self-reference checking in inspect, but this doesn't help as much when the association level is a bit deeper. Maybe I would have left my script for a long time, it would have eventually completed. Here is an example of something with somewhat similar behavior to what I was describing. You can see the breakpoint/stepping in is of little use in such cases. It would be nice if inspect would stop at some point sooner in these cases, but it is good to know it really isn't an infinite loop, just a really long process. Also it really wasn't taking 100% CPU; the process in Activity Monitor in OS X appeared as though it was taking 100%, but I could also see in Activity Monitor that only 12-15% was actually being used. To reproduce similar behavior: class Thing attr_accessor :a_hash attr_accessor :an_array attr_accessor :another_array end class Reporter def report first_ref = Thing.new this_ref = first_ref 20.times do next_ref = Thing.new this_ref.a_hash = {"a#{rand(9999999)} ".to_sym => next_ref} this_ref.an_array = [next_ref] this_ref.another_array = [next_ref] this_ref = next_ref end this_ref.a_hash = {"a#{rand(9999999)} ".to_sym => first_ref} this_ref.an_array = [first_ref] this_ref.another_array = [first_ref] # Uncomment next line if using debugger gem and want to see what I mean about getting stuck when you step into it with 's' # breakpoint puts first_ref.inspect end end r = Reporter.new r.report ---------------------------------------- Bug #6783: Infinite loop in inspect, not overriding inspect, to_s, and no known circular references. Stepping into inspect in debugger locks it up with 100% CPU. https://bugs.ruby-lang.org/issues/6783#change-28348 Author: garysweaver (Gary Weaver) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0] In Ruby 1.9.3p194 in Rails 3.2.6 in rails console, in my script I'm calling inspect on a Ruby object and even though I'm not overriding inspect, to_s, and there are no known circular references, inspect is going into an infinite loop locking Ruby up with 100% CPU usage. At first, I would think this problem is probably outside of Ruby and either in my code or in a gem that I'm using, however the problem is that using the Debugger gem, if I set a breakpoint above the issue and use "s" (by itself) to step into the line where it calls inspect, it locks up there, so I can't debug the issue. When I do that I hit ctrl-c, I'm in .../.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/irb.rb: 64 trap("SIGINT") do => 65 irb.signal_handle 66 end and breaking out of that, or if I don't step into it and I break out of it, I see: path_to_script/script_name.rb:739:in `call' path_to_script/script_name.rb:739:in `inspect' path_to_script/script_name.rb:739:in `inspect' ... (~100 times) path_to_script/script_name.rb:739:in `block (2 levels) in my_method_name' In a situation like this, how can I debug the issue? Is there anything in the inspect method that could causing this behavior? I think the most likely culprit is some bad code on my part in the script, but unfortunately I can't debug it when the debugger can't step into inspect. Thanks for any help you can provide. -- http://bugs.ruby-lang.org/