diff --git a/gc.c b/gc.c index f77ee417c52dea..98e5712ca40214 100644 --- a/gc.c +++ b/gc.c @@ -129,6 +129,14 @@ #include "builtin.h" #include "shape.h" +// TODO: Don't export this function in modular GC, instead MMTk should figure out +// how to combine GC thread backtrace with mutator thread backtrace. +void +rb_gc_print_backtrace(void) +{ + rb_print_backtrace(stderr); +} + unsigned int rb_gc_vm_lock(const char *file, int line) { diff --git a/gc/gc.h b/gc/gc.h index a5edc266e75b1a..097ddb93949a0b 100644 --- a/gc/gc.h +++ b/gc/gc.h @@ -108,6 +108,7 @@ MODULAR_GC_FN void rb_gc_initialize_vm_context(struct rb_gc_vm_context *context) MODULAR_GC_FN void rb_gc_worker_thread_set_vm_context(struct rb_gc_vm_context *context); MODULAR_GC_FN void rb_gc_worker_thread_unset_vm_context(struct rb_gc_vm_context *context); MODULAR_GC_FN void rb_gc_move_obj_during_marking(VALUE from, VALUE to); +MODULAR_GC_FN void rb_gc_print_backtrace(); #endif #if USE_MODULAR_GC diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index 2c447b0d389f65..e9558f906f3242 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -446,6 +446,11 @@ rb_mmtk_gc_thread_bug(const char *msg, ...) vsnprintf(objspace->crash_context.crash_msg, sizeof(objspace->crash_context.crash_msg), msg, args); va_end(args); + fprintf(stderr, "-- GC thread backtrace " + "-------------------------------------------\n"); + rb_gc_print_backtrace(); + fprintf(stderr, "\n"); + rb_mmtk_resume_mutators(); sleep(5);