start (Debugger)

    /*
     *   call-seq:
     *      Debugger.start -> bool
     *      Debugger.start { ... } -> obj
     *
     *   This method activates the debugger.
     *   If it's called without a block it returns +true+, unless debugger was already started.
     *   If a block is given, it starts debugger and yields to block. When the block is finished
     *   executing it stops the debugger with Debugger.stop method.
     *
     *   <i>Note that if you want to stop debugger, you must call Debugger.stop as many time as you
     *   called Debugger.start method.</i>
     */
    static VALUE
    debug_start(VALUE self)
    {
        VALUE result;
        start_count++;

        if(IS_STARTED)
            result = Qfalse;
        else
        {
            breakpoints = rb_ary_new();
            locker      = Qnil;
            threads_tbl = threads_table_create();

            rb_add_event_hook(debug_event_hook, RUBY_EVENT_ALL);
            result = Qtrue;
        }

        if(rb_block_given_p())
            return rb_ensure(rb_yield, self, debug_stop_i, self);
        return result;
    }