REG: How can we debug a ruby script


#1

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


#2

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.


#3

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.


#4

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!


#5

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! (;


#6

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.