From: Robert Klemme Date: 2005-07-01T16:55:43+09:00 Subject: Re: debugger issue pat eyler wrote: > I'm running into an unexpected issue with the debugger, and I'm > hoping someone here can help me out. I' ve got a short program like > this (stolen directly from zenspider's RubyInline tutorial): > > -=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > #!/usr/local/bin/ruby -w > > class Array > > def average > result = 0 > self.each { |x| result += x } > result / self.size.to_f > end > > end > > max_loop = (ARGV.shift || 5).to_i > max_size = (ARGV.shift || 100_000).to_i > a = (1..max_size).to_a > > 1.upto(max_loop) do > avg = a.average > $stderr.print "." > end > $stderr.puts "" > -=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > > > Everytime I step to line 7 (the self.each ... line) or do a step nnn > which executes line 7, the debugger stops there. Neither step or > next will move past this line. If I try to continue the program, it > will run to the next breakpoint or end of the program. > > > -=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > pate@linux:~/scripts> ruby -rdebug averager.rb > Debug.rb > Emacs support available. > > averager.rb:3:class Array > (rdb:1) s 13 > averager.rb:7: self.each { |x| result += x } > (rdb:1) s > averager.rb:7: self.each { |x| result += x } > (rdb:1) s > averager.rb:7: self.each { |x| result += x } > (rdb:1) s > averager.rb:7: self.each { |x| result += x } > (rdb:1) n > averager.rb:7: self.each { |x| result += x } > (rdb:1) n > averager.rb:7: self.each { |x| result += x } > (rdb:1) n > averager.rb:7: self.each { |x| result += x } > (rdb:1) n 20 > averager.rb:7: self.each { |x| result += x } > (rdb:1) c > .... > pate@linux:~/scripts> > -=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- > > > Any idea what's going on? Is this a bug in the debugger, or am I > misunderstanding something? My guess would be that Array#each is a method implemented in C and that your block is just a single line block. The debugger can't step into Array#each and maybe it cannot stop in the block because it's on the same line. Did you try to convert the block to a multiline block? If you step over that line then you execute a single each call, which happens to execute multple callbacks of the block. Kind regards robert