Hi
I’m working on a C extension and somewhere in itsomething is raising a
NoMethodError. The exception is reported with the line of ruby code that
triggered the bad call in the C extension.
As the C code is large and complex (it’s a big SWIG project), I’m having
trouble finding the problem in the C code. I would use gdb or
Microsoft’s debugger to look at the stack if it was a C error - but when
a Ruby exception is raised, the process exits and there’s no stack to
inspect.
Ruby’s debugger isn’t helpful because it only knows about ruby written
in ruby.
Is there any way I can get at the C stack at the point of ruby ‘raise’
from a C extension?
Thanks
alex
On 7/12/07, Alex F. [email protected] wrote:
inspect.
Ruby’s debugger isn’t helpful because it only knows about ruby written
in ruby.
Is there any way I can get at the C stack at the point of ruby ‘raise’
from a C extension?
Thanks
alex
There was a way how to run ruby under gdb with the ability to debug at
“ruby level” while still having the “C view” at hand.
http://eigenclass.org/hiki.rb?ruby+live+process+introspection
http://weblog.jamisbuck.org/2006/9/25/gdb-wrapper-for-ruby
http://redhanded.hobix.com/inspect/theRubyGdbArmsRaceNowAtAStandoff.html
J.
Hi,
i don’t know how to build stack traces, but you can start ruby in gdb.
first call gdb with ruby as argument. On liux it looks like:
det@datengrab:~/Desktop$ gdb /usr/bin/ruby
and then in gdb start your ruby program with “run”
(gdb) run ./my-prg.rb
Cheers
detlef
Am Donnerstag, den 12.07.2007, 23:10 +0900 schrieb Alex F.:
On Jul 12, 2007, at 8:10 AM, Alex F. wrote:
no stack to inspect.
Ruby’s debugger isn’t helpful because it only knows about ruby
written in ruby.
Is there any way I can get at the C stack at the point of ruby
‘raise’ from a C extension?
Thanks
alex
cfp:~ > cat core.rb
BEGIN{ at_exit{ Process.kill ‘SIGSEGV’, Process.pid if $! } }
cfp:~ > cat a.rb
#! /usr/bin/env ruby
require ‘core’
p 42
cfp:~ > ruby a.rb
42
cfp:~ > cat b.rb
#! /usr/bin/env ruby
require ‘core’
raise
cfp:~ > ruby b.rb
./core.rb:1: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i686-darwin8.9.1]
Abort trap (core dumped)
-a
Jano S. wrote:
On 7/12/07, Alex F. [email protected] wrote:
Is there any way I can get at the C stack at the point of ruby ‘raise’
from a C extension?
There was a way how to run ruby under gdb with the ability to debug at
“ruby level” while still having the “C view” at hand.
eigenclass.org
Buckblog: GDB wrapper for Ruby
http://redhanded.hobix.com/inspect/theRubyGdbArmsRaceNowAtAStandoff.html
Thanks for the pointer - that’s really interesting stuff. I got round it
a bit more prosaically by simply setting a breakpoint in gdb where ruby
calls the exception raising class
(gdb) b rb_exc_raise
Breakpoint 1, rb_exc_raise (mesg=3057353380) at eval.c:4583
4583 rb_longjmp(TAG_RAISE, mesg);
(gdb) whe
… tasty stacktrace
cheers
alex
ara.t.howard wrote:
having trouble finding the problem in the C code. I would use gdb or
Thanks
require ‘core’
cfp:~ > ruby b.rb
./core.rb:1: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i686-darwin8.9.1]
Abort trap (core dumped)
Doesn’t that only give you the C stack at the time the ruby process
exits, not at the time the exception is raised?
On Jul 12, 2007, at 4:25 PM, Joel VanderWerf wrote:
Doesn’t that only give you the C stack at the time the ruby process
exits, not at the time the exception is raised?
yeah - it’s a short leap though…
-a