Forum: Ruby REG: How can we debug a ruby script

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
unknown (Guest)
on 2009-03-30 19:52
(Received via mailing list)
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
Brian C. (Guest)
on 2009-03-31 13:13
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.
unknown (Guest)
on 2009-04-19 13:43
(Received via mailing list)
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.
Phlip (Guest)
on 2009-04-19 19:06
(Received via mailing list)
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 (Guest)
on 2009-04-19 19:20
(Received via mailing list)
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! (;
Brian C. (Guest)
on 2009-04-19 21:24
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.
This topic is locked and can not be replied to.