REG: How can we debug a ruby script

Hi,
I want to debug a ruby script using -rdebug option.
The following is the source code: with file fact.rb.
Fact.rb
def fact(n)
  return 1 if n == 0
  f = 1
  n.downto(1) do |i|
    f *= i
  end
  return f
end
print fact(2), "\n"

Debugging
When I run the following command and type 'n' for debugin the next line, it is going in to some other files.
As shown below.
C:\ruby\samples\RubySrc-1.8.6-p111\sample>ruby -rdebug fact.rb
Debug.rb
Emacs support available.

c:/ruby/lib/ruby/site_ruby/1.8/ubygems.rb:10:require 'rubygems'
(rdb:1) list
[5, 14] in c:/ruby/lib/ruby/site_ruby/1.8/ubygems.rb
   5 # All rights reserved.
   6 # See LICENSE.txt for permissions.
   7 #++
   8
   9
=> 10 require 'rubygems'
(rdb:1) n
c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:10:require 'rbconfig'
(rdb:1) n
c:/ruby/lib/ruby/1.8/i386-mswin32/rbconfig.rb:5:module Config
(rdb:1) n
c:/ruby/lib/ruby/1.8/i386-mswin32/rbconfig.rb:153:RbConfig = Config # compatibility for ruby-1.9
(rdb:1) n
c:/ruby/lib/ruby/1.8/i386-mswin32/rbconfig.rb:154:CROSS_COMPILING = nil unless defined? CROSS_COMPILING
(rdb:1) n
c:/ruby/lib/ruby/1.8/i386-mswin32/rbconfig.rb:154:CROSS_COMPILING = nil unless defined? CROSS_COMPILING
(rdb:1) n
c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:12:module Gem
(rdb:1) n
c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:18:module Kernel
(rdb:1)'

What is the command that iam supposed to used to debug actual source code, line by line( with out moving to other files)?

Thanks and Regards,
Anil kumar

Something in your environment is making ruby do -rubygems (require
'rubygems')
Perhaps the RUBYOPT environment variable is set, because I can replicate
your problem like this:

$ export RUBYOPT=-rubygems
$ ruby -rdebug fact.rb
Debug.rb
Emacs support available.

/usr/local/lib/site_ruby/1.8/ubygems.rb:10:require 'rubygems'
(rdb:1)

So if this is the case, solution 1 is simply to unset the RUBYOPT
variable.

Solution 2 is to set a breakpoint at the start of your program.

$ ruby -rdebug fact.rb
Debug.rb
Emacs support available.

/usr/local/lib/site_ruby/1.8/ubygems.rb:10:require 'rubygems'
(rdb:1) b fact.rb:1
Set breakpoint 1 at fact.rb:1
(rdb:1) cont
Breakpoint 1, toplevel at fact.rb:1
fact.rb:1:def fact(n)
(rdb:1) n
fact.rb:9:print fact(2), "\n"
(rdb:1) n
2
$

Solution 3 is to require rubygems *before* requiring debug, because when
it has been required once, it won't be required again:

$ ruby -rubygems -rdebug fact.rb
Debug.rb
Emacs support available.

fact.rb:1:def fact(n)
(rdb:1)

This third one probably involves the least work.

···

--
Posted via http://www.ruby-forum.com/.

Hi,
Using the below method mention the below mail, I was successfully able to run and debug the script.
But when I run unittest class, the flow goes into testcase case class as below.

Testscript
require "test/unit"

class TestSimpleNumber < Test::Unit::TestCase

  def test_simple
    assert_equal("abc", "abc" )
    
  end

  def test_typecheck
    assert_equal("abc", "abc" )
  end

  def test_failure
    assert_equal("abc", "abc" )
  end

End

Execution:

C:\ruby>ruby -rubygems -rdebug unittest.rb
Debug.rb
Emacs support available.

unittest.rb:1:require "test/unit"
(rdb:1) b 6
Set breakpoint 1 at unittest.rb:6
(rdb:1) cont
Loaded suite unittest
Started
.Breakpoint 1, test_simple at unittest.rb:6
unittest.rb:6: assert_equal("abc", "abc" )
(rdb:1) n
c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:85: begin
(rdb:1) n
c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:86: teardown
(rdb:1) n
c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:94: result.add_run
(rdb:1) n
c:/ruby/lib/ruby/1.8/test/unit/testcase.rb:95: yield(FINISHED, name)
(rdb:1) n
c:/ruby/lib/ruby/1.8/test/unit/ui/testrunnermediator.rb:47: notify_listeners(channel, value)
(rdb:1)

Please help me in this regard.

Thanks,
Anil kumar.

···

-----Original Message-----
From: b.candler@pobox.com [mailto:b.candler@pobox.com]
Sent: 31 March, 2009 12:14
To: ruby-talk ML
Subject: Re: REG: How can we debug a ruby script

Something in your environment is making ruby do -rubygems (require
'rubygems')
Perhaps the RUBYOPT environment variable is set, because I can
replicate your problem like this:

$ export RUBYOPT=-rubygems
$ ruby -rdebug fact.rb
Debug.rb
Emacs support available.

/usr/local/lib/site_ruby/1.8/ubygems.rb:10:require 'rubygems'
(rdb:1)

So if this is the case, solution 1 is simply to unset the
RUBYOPT variable.

Solution 2 is to set a breakpoint at the start of your program.

$ ruby -rdebug fact.rb
Debug.rb
Emacs support available.

/usr/local/lib/site_ruby/1.8/ubygems.rb:10:require 'rubygems'
(rdb:1) b fact.rb:1
Set breakpoint 1 at fact.rb:1
(rdb:1) cont
Breakpoint 1, toplevel at fact.rb:1
fact.rb:1:def fact(n)
(rdb:1) n
fact.rb:9:print fact(2), "\n"
(rdb:1) n
2
$

Solution 3 is to require rubygems *before* requiring debug,
because when it has been required once, it won't be required again:

$ ruby -rubygems -rdebug fact.rb
Debug.rb
Emacs support available.

fact.rb:1:def fact(n)
(rdb:1)

This third one probably involves the least work.
--
Posted via http://www.ruby-forum.com/.

Tips for posting:

Don't reply to someone else's thread and change the name. Start a new thread
with your New button.

Now to your problem - is this a typo?

End

The code should not compile with that error, but your stack trace implies
you started executing. However...

C:\ruby>ruby -rubygems -rdebug unittest.rb

You might need -rrubygems.

Next, report what happens without the -rdebug. I never debug unit tests -
they tend to help you avoid excess debugging!

···

--
  Phlip

Phlip wrote:

Tips for posting:

Don't reply to someone else's thread and change the name. Start a new thread with your New button.

My bad! I didn't notice the thread was the same.

Carry on! (;

Phlip wrote:

C:\ruby>ruby -rubygems -rdebug unittest.rb

You might need -rrubygems.

-rubygems is correct (the file "ubygems.rb" exists for this purpose)

Next, report what happens without the -rdebug. I never debug unit tests

The problem may be that Test::Unit does strange stuff with atexit to
start the tests. I'm afraid I don't have a good solution for using
-rdebug with Test::Unit. Try writing a separate standalone program which
replicates the problem.

Regards,

Brian.

···

--
Posted via http://www.ruby-forum.com/.