banister / pry-stack_explorer

MOVED TO https://github.com/pry/pry-stack_explorer
https://github.com/pry/pry-stack_explorer
Other
18 stars 1 forks source link

Infinite loop caused by seemingly innocuous code #30

Open smackesey opened 11 years ago

smackesey commented 11 years ago

The below code causes an infinite loop:

def <=>(another)
  if not IGNORE_SLICE_LOC
    @values[:code] <=> another.code
  else
    code1, code2 = [@values[:code], another.code].map do |code|
      self.class.erase_slice_loc_from_code(code)
    end
    code1 <=> code2
  end
rescue StandardError => e
  puts e.backtrace[0]
  binding.pry
end

printing this to standard output over and over again:

/Users/seanmackesey/Desktop/count_inference/lib/db/models/region.rb:288:in `<=>'

Hitting Ctrl-c stops the loop and prints this message:

^Cwhen_started hook failed: Interrupt: /Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_started_hook.rb:5:in `caller_bindings' (see pry.hooks.errors to debug)

Then the binding.pry in the rescue block is triggered. e gives:

[3] pry(#)> e => #<NoMethodError: undefined method `code' for Pry:Class>

e.backtrace seems to be looping infinitely over these lines:

[ 208] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 209] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 210] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 211] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 212] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 213] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 214] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 215] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.7/lib/pry-stack_explorer/when_s [ 216] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/hooks.rb:154:in block (2 levels) i [ 217] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/hooks.rb:152:inmap'", [ 218] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/hooks.rb:152:in block in exec_hook [ 219] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/helpers/base_helpers.rb:12:insile [ 220] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/hooks.rb:151:in exec_hook'", [ 221] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/pry_instance.rb:476:inexec_hook'" [ 222] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/pry_class.rb:139:in start'", [ 223] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-debugger-0.2.1/lib/pry-debugger/pry_ext.rb:15:in [ 224] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-debugger-0.2.1/lib/pry-debugger/processor.rb:18:in [ 225] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-debugger-0.2.1/lib/pry-debugger/processor.rb:17:in [ 226] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-debugger-0.2.1/lib/pry-debugger/processor.rb:17:in [ 227] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-debugger-0.2.1/lib/pry-debugger/pry_ext.rb:14:in [ 228] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-0.9.10/lib/pry/core_extensions.rb:22:inpry'", [ 229] "/Users/seanmackesey/Desktop/count_inference/lib/db/models/region.rb:295:in rescue in <=>'", [ 230] "/Users/seanmackesey/Desktop/count_inference/lib/db/models/region.rb:285:in<=>'",

another, an argument passed into the method, gives this:

[4] pry(#)> another => Pry < Object

Removal of the rescue block causes the code to work fine.

banister commented 11 years ago

Hi, i think i fixed it on HEAD, i pushed a prerelease gem for you to test. Could you gem install pry-stack_explorer --pre and tell me if the bug is gone? thanks (btw the real repo for this project is https://github.com/pry/pry-stack_explorer :)

smackesey commented 11 years ago

Hmm, it no longer enters an infinite loop, but an exception is still thrown:

/Users/seanmackesey/Desktop/count_inference/lib/db/models/region.rb:288:in <=>' when_started hook failed: NoMethodError: undefined methodsafe_send' for #PryStackExplorer::WhenStartedHook:0x007fdc10abd378 /Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/pry-stack_explorer-0.4.8pre1/lib/pry-stack_explorer/when_started_hook.rb:10:in `block in caller_bindings' (see pry.hooks.errors to debug)

From: /Users/seanmackesey/Desktop/count_inference/lib/db/models/region.rb @ line 284 Region#<=>:

   284: def <=>(another)
   285:   if not IGNORE_SLICE_LOC
   286:     @values[:code] <=> another.code
   287:   else
   288:     code1, code2 = [@values[:code], another.code].map do |code|
   289:       self.class.erase_slice_loc_from_code(code)
   290:     end
   291:     code1 <=> code2
   292:   end
   293: rescue StandardError => e
   294:   puts e.backtrace[0]
=> 295:   binding.pry
   296: end

[1] pry(#)> e => #<NoMethodError: undefined method code' for nil:NilClass> [2] pry(#<Region>)> e.backtrace => [ [ 0] "/Users/seanmackesey/Desktop/count_inference/lib/db/models/region.rb:288:in<=>'", [ 1] "/Users/seanmackesey/Desktop/count_inference/lib/count_inference/optimization/parameter_list_generator.rb:86:in=='", [ 2] "/Users/seanmackesey/Desktop/count_inference/lib/count_inference/optimization/parameter_list_generator.rb:86:ininclude?'", [ 3] "/Users/seanmackesey/Desktop/count_inference/lib/count_inference/optimization/parameter_list_generator.rb:86:inblock in create_class_counts'", [ 4] "/Users/seanmackesey/Desktop/count_inference/lib/count_inference/optimization/parameter_list_generator.rb:76:ineach'", [ 5] "/Users/seanmackesey/Desktop/count_inference/lib/count_inference/optimization/parameter_list_generator.rb:76:increate_class_counts'", [ 6] "/Users/seanmackesey/Desktop/count_inference/lib/count_inference/optimization/parameter_list_generator.rb:23:inprocess'", [ 7] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/processor.rb:16:inblock in process'", [ 8] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/processor.rb:13:ineach'", [ 9] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/processor.rb:13:inprocess'", [10] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/segment.rb:22:inprocess_element'", [11] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/segment.rb:16:inprocess'", [12] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/pipeline.rb:160:inblock in process_data'", [13] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/pipeline.rb:158:ineach'", [14] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/pipeline.rb:158:inprocess_data'", [15] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/pipeline.rb:109:inrun'", [16] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/transformer.rb:170:inrun_pipeline'", [17] "/Users/seanmackesey/Desktop/csv_port/lib/csv_port/transformer.rb:63:intransform'", [18] "bin/transform:16:inblock in

'", [19] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/methadone-1.2.4/lib/methadone/main.rb:366:incall'", [20] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/methadone-1.2.4/lib/methadone/main.rb:366:incall_main'", [21] "/Users/seanmackesey/.rvm/gems/ruby-1.9.3-p194/gems/methadone-1.2.4/lib/methadone/main.rb:165:ingo!'", [22] "bin/transform:30:in
'" ]

The backtrace no longer goes through pry-stack_explorer at all it seems

banister commented 11 years ago

what version of pry do you have? a new version has been released and safe_send is exposed there. Could you upgrade to pry version 0.9.11.4 ?

exocode commented 11 years ago

have the same problem with Pry version 0.9.12.2 on Ruby 1.9.3