From: Magnus Holm Date: 2013-06-27T18:10:22+09:00 Subject: [ruby-core:55670] Re: [ruby-trunk - Bug #8538] c method not pushed into the callstack when called, but popped when returned --001a11c3ca149bacc004e01f21fb Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable It seems like #initialize is never pushed to the stack: class Foo def initialize puts caller end end Foo.new Result: f.rb:8:in `new' f.rb:8:in `
' // Magnus Holm On Thu, Jun 27, 2013 at 10:23 AM, deivid (David Rodr=C3=ADguez) < deivid.rodriguez@gmail.com> wrote: > > Issue #8538 has been updated by deivid (David Rodr=C3=ADguez). > > > "no replies after 10 days" reminder. This is affecting > https://github.com/deivid-rodriguez/byebug, I can easily make it crash by > doing: > > davidr@pantani:~/Proyectos/byebug$ ruby -Ilib -rbyebug -e 'byebug; > fail "Bang!"' > -e @ 1 > (byebug) catch Exception > Catch exception Exception. > (byebug) c > Catchpoint at -e:1: `Bang!' (RuntimeError) > from /home/davidr/Proyectos/byebug/lib/byebug/context.rb:44:i= n > `at_catchpoint' > from -e:1:in `
' > -e @ 1 > (byebug) bt > --> #0
at -e:1 > INTERNAL ERROR!!! That frame doesn't exist! > > /home/davidr/Proyectos/byebug/lib/byebug/commands/frame.rb:90:in > `frame_file' > > /home/davidr/Proyectos/byebug/lib/byebug/commands/frame.rb:90:in > `print_frame' > > /home/davidr/Proyectos/byebug/lib/byebug/commands/frame.rb:85:in `block i= n > print_backtrace' > > /home/davidr/Proyectos/byebug/lib/byebug/commands/frame.rb:84:in `each' > > /home/davidr/Proyectos/byebug/lib/byebug/commands/frame.rb:84:in > `print_backtrace' > > /home/davidr/Proyectos/byebug/lib/byebug/commands/frame.rb:127:in `execut= e' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:260:in > `one_cmd' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:244:in > `block (2 levels) in process_commands' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:243:in > `each' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:243:in > `block in process_commands' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:236:in > `catch' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:236:in > `process_commands' > /home/davidr/Proyectos/byebug/lib/byebug/processor.rb:158:in > `at_line' > (eval):5:in `block in at_line' > (eval):3:in `synchronize' > (eval):3:in `at_line' > /home/davidr/Proyectos/byebug/lib/byebug/context.rb:52:in > `at_line' > -e:1:in `
'-e:1:in `
': Bang! (RuntimeError) > > When the raise event comes, byebug thinks the stack size is 2 but there's > only one element. I think this is caused by the inconsistent behaviour > explained above. > > Thanks a lot guys! > ---------------------------------------- > Bug #8538: c method not pushed into the callstack when called, but popped > when returned > https://bugs.ruby-lang.org/issues/8538#change-40173 > > Author: deivid (David Rodr=C3=ADguez) > Status: Open > Priority: Normal > Assignee: > Category: > Target version: > ruby -v: ruby 2.0.0p195 (2013-05-14) [i686-linux] > Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN > > > See the following example: > > trace =3D TracePoint.new do |tp| > puts "Event: #{tp.event}, Method: #{tp.method_id}\n" > puts "Stack: #{caller}\n\n" > end > > trace.enable > > fail "bang!" > > The output shows: > > Event: c_return, Method: enable > Stack: ["trace.rb:6:in `
'"] > > Event: line, Method: > Stack: ["trace.rb:8:in `
'"] > > Event: c_call, Method: fail > Stack: ["trace.rb:8:in `
'"] > > Event: c_call, Method: new > Stack: ["trace.rb:8:in `fail'", "trace.rb:8:in `
'"] > > Event: c_call, Method: initialize > Stack: ["trace.rb:8:in `new'", "trace.rb:8:in `fail'", "trace.rb:8:in > `
'"] > > Event: c_return, Method: initialize > Stack: ["trace.rb:8:in `new'", "trace.rb:8:in `fail'", "trace.rb:8:in > `
'"] > > Event: c_return, Method: new > Stack: ["trace.rb:8:in `fail'", "trace.rb:8:in `
'"] > > Event: c_call, Method: backtrace > Stack: ["trace.rb:8:in `
'"] > > Event: c_return, Method: backtrace > Stack: ["trace.rb:8:in `
'"] > > Event: raise, Method: > Stack: ["trace.rb:8:in `
'"] > > Event: c_return, Method: fail > Stack: ["trace.rb:8:in `
'"] > > trace.rb:8:in `
': bang! (RuntimeError) > > It looks like the method "initialize" is not pushed into the stack when > called, but something (the previous method call) is popped when returning > from it. > > Thanks a lot. > > > -- > http://bugs.ruby-lang.org/ > > --001a11c3ca149bacc004e01f21fb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
It seems like #initialize is never pushed t= o the stack:

=C2=A0 class Foo
=C2=A0=C2=A0=C2=A0 def = initialize
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 puts caller
=C2= =A0=C2=A0=C2=A0 end
=C2=A0 end

=C2=A0 Foo.ne= w

Result:

f.rb:8:in `new'
f.rb:8:in `<main>'
<= br>


// Magnus Holm


On Thu, Jun 27, 2013 at 10:23 AM, deivid= (David Rodr=C3=ADguez) <deivid.rodriguez@gmail.com> wrote:

Issue #8538 has been updated by deivid (David Rodr=C3=ADguez).


"no replies after 10 days" reminder. This is affecting https://gith= ub.com/deivid-rodriguez/byebug, I can easily make it crash by doing:
=C2=A0 =C2=A0 davidr@pantani:~/Proyectos/byebug$ ruby -Ilib -rbyebug -e = 9;byebug; fail "Bang!"'
=C2=A0 =C2=A0 -e @ 1
=C2=A0 =C2=A0 (byebug) catch Exception
=C2=A0 =C2=A0 Catch exception Exception.
=C2=A0 =C2=A0 (byebug) c
=C2=A0 =C2=A0 Catchpoint at -e:1: `Bang!' (RuntimeError)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 from /home/davidr/Proyectos/byebu= g/lib/byebug/context.rb:44:in `at_catchpoint'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 from -e:1:in `<main>' =C2=A0 =C2=A0 -e @ 1
=C2=A0 =C2=A0 (byebug) bt
=C2=A0 =C2=A0 --> #0 =C2=A0<main> at -e:1
=C2=A0 =C2=A0 INTERNAL ERROR!!! That frame doesn't exist!
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/commands/frame.rb:90:in `frame_file'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/commands/frame.rb:90:in `print_frame'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/commands/frame.rb:85:in `block in print_backtrace'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/commands/frame.rb:84:in `each'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/commands/frame.rb:84:in `print_backtrace'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/commands/frame.rb:127:in `execute'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:260:in `one_cmd'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:244:in `block (2 levels) in process_commands'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:243:in `each'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:243:in `block in process_commands'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:236:in `catch'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:236:in `process_commands'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/processor.rb:158:in `at_line'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eval):5:in `block in at_line'= ;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eval):3:in `synchronize'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (eval):3:in `at_line'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /home/davidr/Proyectos/byebug/lib= /byebug/context.rb:52:in `at_line'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -e:1:in `<main>'-e:1:in= `<main>': Bang! (RuntimeError)

When the raise event comes, byebug thinks the stack size is 2 but there'= ;s only one element. I think this is caused by the inconsistent behaviour e= xplained above.

Thanks a lot guys!
----------------------------------------
Bug #8538: c method not pushed into the callstack when called, but popped w= hen returned
https://bugs.ruby-lang.org/issues/8538#change-40173

Author: deivid (David Rodr=C3=ADguez)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 2.0.0p195 (2013-05-14) [i686-linux]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


See the following example:

=C2=A0 =C2=A0 trace =3D TracePoint.new do |tp|
=C2=A0 =C2=A0 =C2=A0 puts "Event: #{tp.event}, Method: #{tp.method_id}= \n"
=C2=A0 =C2=A0 =C2=A0 puts "Stack: #{caller}\n\n"
=C2=A0 =C2=A0 end

=C2=A0 =C2=A0 trace.enable

=C2=A0 =C2=A0 fail "bang!"

The output shows:

=C2=A0 =C2=A0 Event: c_return, Method: enable
=C2=A0 =C2=A0 Stack: ["trace.rb:6:in `<main>'"]

=C2=A0 =C2=A0 Event: line, Method:
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_call, Method: fail
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_call, Method: new
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `fail'", "trace.rb:= 8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_call, Method: initialize
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `new'", "trace.rb:8= :in `fail'", "trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_return, Method: initialize
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `new'", "trace.rb:8= :in `fail'", "trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_return, Method: new
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `fail'", "trace.rb:= 8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_call, Method: backtrace
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_return, Method: backtrace
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: raise, Method:
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 Event: c_return, Method: fail
=C2=A0 =C2=A0 Stack: ["trace.rb:8:in `<main>'"]

=C2=A0 =C2=A0 trace.rb:8:in `<main>': bang! (RuntimeError)

It looks like the method "initialize" is not pushed into the stac= k when called, but something (the previous method call) is popped when retu= rning from it.

Thanks a lot.


--
http://bugs.ruby-l= ang.org/


--001a11c3ca149bacc004e01f21fb--