      VALUE filename = srcfile ? rb_str_new2(srcfile) : Qnil;
      VALUE argv[6];
      int line = rb_sourceline();
-@@ -4015,11 +4088,16 @@
+@@ -4024,11 +4097,16 @@
      VALUE klass = 0;
  
      if (p->event == RUBY_EVENT_C_CALL ||

 		ID id_mesg;
Index: proc.c
===================================================================
--- proc.c	(revision 26959)
+++ proc.c	(working copy)
@@ -27,7 +27,7 @@
 VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc);

+        exec_event_hooks(th->event_hooks, flag, self, id, klass);
     }
-    if (wait_event & RUBY_EVENT_VM) {
+    if (wait_event & RUBY_EVENT_VM && th->tracing <= 0) {
 	if (th->vm->event_hooks == NULL) {
 	    th->event_flags &= (~RUBY_EVENT_VM);
 	}
 	else {
-	    exec_event_hooks(th->vm->event_hooks, flag, self, id, klass);
+	    if (0 == th->exec_event_tracing) {
+		/* Modified from ruby_suppress_tracing */
+		int state;
+		volatile int raised = rb_threadptr_reset_raised(th);
+		rb_block_t * base_block_save = th->base_block;
+		th->exec_event_tracing = 1;
+		
+		PUSH_TAG();
+		if ((state = EXEC_TAG()) == 0) {
+		    exec_event_hooks(th->vm->event_hooks, flag, self, id, klass);
+		}
+		
+		th->base_block = base_block_save;
+		if (raised) {
+		    rb_threadptr_set_raised(th);
+		}
+		POP_TAG();
+		
+		th->exec_event_tracing = 0;
+		if (state) {
+		    JUMP_TAG(state);
+		}
+	    }
 	}
     }
     th->errinfo = errinfo;
@@ -3867,8 +3899,9 @@
 
 /*
  *  call-seq:
