-
Notifications
You must be signed in to change notification settings - Fork 4
Method returns: stopping, setting and showing the return value
One problem often remarked on with ruby-debug is that is that if you have debugger as the last statement of a method, the debugger call occurs in the next statement which occurs after the method returns. This problem is a result of line-event orientation that ruby-debug has.
trepan stops on events other than line events. In particular c_return and return events are the important events to stop at here.
The next stopping event when you issue finish or step< is a “return” or “c_return” event. The icons for this in output are “<” or “<C” respectively. When the debugger is stopped at one of these events, the return value can be inspected. It can be changed it too!
Here’s a session:
trepan /tmp/foo.rb -- (/tmp/foo.rb:1) def foo (trepan): list 1 -> def foo 2 5 3 end 4 puts foo (trepan): set events return Trace events we may stop on: return (trepan): step <- (/tmp/foo.rb:3) end (trepan): info return Return value: 5 (trepan): set return "I just changed the return value" Return value was: 5 New value is: "I just changed the return value" (trepan): c I just changed the return value $
You can also see and set return values from C functions as well. For variety, in the session below I’ll show this from an irb rather than starting from a file.
$ irb
>> require 'trepanning'
=> true
>> Trepan.debug_str("File.basename('a/b.c')")
-- (/tmp/eval-20100331-15170-5js2i5.rb:1)
File.basename('a/b.c')
(trepan): set events c_call, c_return # make sure we catch the right events
Trace events we may stop on:
c_call, c_return
(trepan): s- # we want to step staying on the same line
CFUNC File#basename("a/b.c")
C> (eval File.basename('...:1 via /tmp/eval-20100331-15170-5js2i5.rb:1)
File.basename('a/b.c')
1 File.basename('a/b.c')
(trepan): s- # we want to step staying on the same line
<C (eval File.basename('...:1 via /tmp/eval-20100331-15170-5js2i5.rb:1)
r=> "b.c" # return value from the function
File.basename('a/b.c')
1 File.basename('a/b.c')
(trepan): set return 'Hello, world!'
Return value was: "b.c"
New value is: "Hello, world!"
(trepan): c
=> "Hello, world!" # return value from irb reflecting above modification
>>
The “/tmp/eval-…” position messages are because the debugger wrote the string out as a temporary file in order to show what is happening as you debug.