diff --git a/ChangeLog b/ChangeLog
index 3d71434870..803e61f170 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Feb 20 14:36:16 2010  Yukihiro Matsumoto  <matz@ruby-lang.org>
+
+	* vm.c (vm_backtrace_each): use called_id when method definition
+	  structure is already freed.  [ruby-dev:40234] [ruby-core:27959]
+
 Fri Feb 19 00:04:19 2010  Yusuke Endoh  <mame@tsg.ne.jp>
 
 	* lib/drb/drb.rb (DRbServer#stop_service): join killed thread to
diff --git a/vm.c b/vm.c
index 6cfea72e33..96a04bfcba 100644
--- a/vm.c
+++ b/vm.c
@@ -731,8 +731,14 @@ vm_backtrace_each(rb_thread_t *th, int lev, rb_backtrace_iter_func *iter, void *
 	    }
 	}
 	else if (RUBYVM_CFUNC_FRAME_P(cfp)) {
+	    ID id;
+
 	    if (NIL_P(file)) file = rb_str_new_cstr("ruby");
-	    if ((*iter)(arg, file, line_no, rb_id2str(cfp->me->def->original_id))) break;
+	    if (cfp->me->def)
+		id = cfp->me->def->original_id;
+	    else
+		id = cfp->me->called_id;
+	    if ((*iter)(arg, file, line_no, rb_id2str(id))) break;
 	}
 	cfp = RUBY_VM_NEXT_CONTROL_FRAME(cfp);
     }