1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) d74e5d5b4f: [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(-)
This commit is contained in:
nagachika 2021-06-13 14:07:06 +09:00
parent 3d6b5c2313
commit f0a1c06349
2 changed files with 34 additions and 32 deletions

View file

@ -12,11 +12,11 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 2
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
#define RUBY_PATCHLEVEL 102
#define RUBY_PATCHLEVEL 103
#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 6
#define RUBY_RELEASE_DAY 10
#define RUBY_RELEASE_DAY 13
#include "ruby/version.h"

View file

@ -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; i<RARRAY_LEN(vm->loaded_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:<unnamed>\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; i<RARRAY_LEN(vm->loaded_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:<unnamed>\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");
}