From 5b87294d2fc84b7039a703cbbd02c7cf50c5b560 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Sat, 3 Jan 2026 09:27:15 -0500 Subject: [PATCH 1/2] Add rb_gc_print_backtrace --- gc.c | 8 ++++++++ gc/gc.h | 1 + 2 files changed, 9 insertions(+) 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 From a0c483fcfb9b8a2009cf21a8bce5fa2ad54d4fda Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Sat, 3 Jan 2026 09:51:00 -0500 Subject: [PATCH 2/2] Also output GC thread backtrace in rb_mmtk_gc_thread_bug --- gc/mmtk/mmtk.c | 5 +++++ 1 file changed, 5 insertions(+) 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);