Hi,

I've been working on simple ruby debugger that is using
Kernel.set_trace_func method. In my work I've found that it is possible
to write a program that behave different depending on tracing function
is set or not.

Here is an example application:
at_exit {
    puts 'program terminated'
}
Thread.abort_on_exception = true
$stdout.sync = true
$stderr.sync = true
begin
    Thread.new {
        raise Exception, 'Kill them all!!!'
    }
    sleep 5
rescue SystemExit
    printf("Exception caught\n")
end
set_trace_func nil

The output is:
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:19:
Kill them all!!! (Exception)
  from
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:18:in
`initialize'
  from
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:18:in
`new'
  from
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:18
Exception caught
program terminated

But if we add code setting dummy tracing function, we will find that
sleep is not interrupted and rescue block is not called:

at_exit {
    puts 'program terminated'
}
Thread.abort_on_exception = true
$stdout.sync = true
$stderr.sync = true

def trace(event, file, line, id, binding, klass)
    a = 1
end
set_trace_func proc { |event, file, line, id, binding, klass|
    trace(event, file, line, id, binding, klass)
}

begin
    Thread.new {
        raise Exception, 'Kill them all!!!'
    }
    sleep 5
rescue SystemExit
    printf("Exception caught\n")
end
set_trace_func nil

The output is:
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:18:
Kill them all!!! (Exception)
  from
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:17:in
`initialize'
  from
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:17:in
`new'
  from
C:/Work/Xored/runtime-EclipseApplication/Test/AbortOnException.rb:17
program terminated


I want somebody to comment what is the big difference?

Thanks,
Timur
-- 
Posted via http://www.ruby-forum.com/.