From f0a1c063490d69f0868876deed74ad52db63cf4b Mon Sep 17 00:00:00 2001 From: nagachika Date: Sun, 13 Jun 2021 14:07:06 +0900 Subject: merge revision(s) d74e5d5b4fba41a9120b3ed2762cf765478605ad: [Backport #17948] Crash more nicely when the VM isn't fully set up If we crash but the VM isn't fully alive, we can get an infinite loop. --- vm_dump.c | 62 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 30 deletions(-) --- vm_dump.c | 62 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 30 deletions(-) (limited to 'vm_dump.c') diff --git a/vm_dump.c b/vm_dump.c index 043c07ccd9..55095945be 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -1019,36 +1019,38 @@ rb_vm_bugreport(const void *ctx) LIMITED_NAME_LENGTH(name), RSTRING_PTR(name)); fprintf(stderr, "\n"); } - fprintf(stderr, "* Loaded features:\n\n"); - for (i=0; iloaded_features); i++) { - name = RARRAY_AREF(vm->loaded_features, i); - if (RB_TYPE_P(name, T_STRING)) { - fprintf(stderr, " %4d %.*s\n", i, - LIMITED_NAME_LENGTH(name), RSTRING_PTR(name)); - } - else if (RB_TYPE_P(name, T_CLASS) || RB_TYPE_P(name, T_MODULE)) { - const char *const type = RB_TYPE_P(name, T_CLASS) ? - "class" : "module"; - name = rb_search_class_path(rb_class_real(name)); - if (!RB_TYPE_P(name, T_STRING)) { - fprintf(stderr, " %4d %s:\n", i, type); - continue; - } - fprintf(stderr, " %4d %s:%.*s\n", i, type, - LIMITED_NAME_LENGTH(name), RSTRING_PTR(name)); - } - else { - VALUE klass = rb_search_class_path(rb_obj_class(name)); - if (!RB_TYPE_P(klass, T_STRING)) { - fprintf(stderr, " %4d #<%p:%p>\n", i, - (void *)CLASS_OF(name), (void *)name); - continue; - } - fprintf(stderr, " %4d #<%.*s:%p>\n", i, - LIMITED_NAME_LENGTH(klass), RSTRING_PTR(klass), - (void *)name); - } - } + if (vm->loaded_features) { + fprintf(stderr, "* Loaded features:\n\n"); + for (i=0; iloaded_features); i++) { + name = RARRAY_AREF(vm->loaded_features, i); + if (RB_TYPE_P(name, T_STRING)) { + fprintf(stderr, " %4d %.*s\n", i, + LIMITED_NAME_LENGTH(name), RSTRING_PTR(name)); + } + else if (RB_TYPE_P(name, T_CLASS) || RB_TYPE_P(name, T_MODULE)) { + const char *const type = RB_TYPE_P(name, T_CLASS) ? + "class" : "module"; + name = rb_search_class_path(rb_class_real(name)); + if (!RB_TYPE_P(name, T_STRING)) { + fprintf(stderr, " %4d %s:\n", i, type); + continue; + } + fprintf(stderr, " %4d %s:%.*s\n", i, type, + LIMITED_NAME_LENGTH(name), RSTRING_PTR(name)); + } + else { + VALUE klass = rb_search_class_path(rb_obj_class(name)); + if (!RB_TYPE_P(klass, T_STRING)) { + fprintf(stderr, " %4d #<%p:%p>\n", i, + (void *)CLASS_OF(name), (void *)name); + continue; + } + fprintf(stderr, " %4d #<%.*s:%p>\n", i, + LIMITED_NAME_LENGTH(klass), RSTRING_PTR(klass), + (void *)name); + } + } + } fprintf(stderr, "\n"); } -- cgit v1.2.3