Binding & Exception, how to get more introspection?

Hi,

I am using some tracing to debug my code. When an exception bombs,
I display it. Together with the call stack (thanks to caller()). Fine.

def something_broken()
some_bug
rescue Exception; debug
end

def debug
p $!
p caller
end

Yet, more information is welcome about the context when the
exception bombed. Things like local variables and “self” for example:

empty.rb

def something_broken()
myvar = "hello"
some_bug
rescue Exception; debug binding
end

def debug( binding )
p $!
p caller
eval( “p self; local_variables.each do |v| p v, ‘==’, eval( v) end”,
binding)
end

something_broken()

Result:
#<NameError: undefined local variable or method some_bug' for main:Object> ["empty.rb:11:insomething_broken’", “empty.rb:20”]
main
"myvar"
"=="
“hello”

Neat ! I can display both “self” and the local variables.

Yet I want more. Things like the local variables and self from
the broken method’s caller and so on up to the top of the stack.

Questions:

1 - Is there a more direct way to get the binding ?
I would rather write:
rescue Exception; debug
then:
rescue Exception; debug binding

2 - Looking for some Exception##binding() that would return
the Binding where the exception bombed, I found a private
Exception##binding(). It does return a Binding, yet…
In the returned Binding, self is the exception itself, not the
self when the exception bombed. I have no clue what this is for,
any idea ?

3 - Is there a way to get the binding not only of the caller
but also the caller’s caller and so on ?

4 - Is there a way to avoid using eval() to get “self” and the
local variables ?

5 - Is there a variant of caller() that would provide Binding objects ?
Or a variant of binding(), say: binding( 0), to walk the stack ?

6 - I think that I could get by with set_trace_proc() handling
"call" and “return” events, but this is way to slow for me. Does
anything faster exists ?

Thanks in advance.

Jean-Hugues Robert