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

Include JIT information in crash reports

Since enabling YJIT or MJIT drastically changes what could go wrong at
runtime, it's good to be front and center about whether they are enabled
when dumping a crash report. Previously, `RUBY_DESCRIPTION` and the
description printed when crashing can be different when a JIT is on.

Introduce a new internal data global, `rb_dynamic_description`, and set
it to be the same as `RUBY_DESCRIPTION` during initialization; use it
when crashing.

 * version.c: Init_ruby_description(): Initialize and use
       `rb_dynamic_description`.
 * error.c: Change crash reports to use `rb_dynamic_description`.
 * ruby.c: Call `Init_ruby_description()` earlier. Slightly more work
       for when we exit right after printing the description but that
       was deemed acceptable.
 * include/ruby/version.h: Talk about how JIT info is not in
      `ruby_description`.
 * test/-ext-/bug_reporter/test_bug_reporter.rb: Remove handling for
       crash description being different from `RUBY_DESCRIPTION`.
 * test/ruby/test_rubyoptions.rb: ditto

Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Co-authored-by: Alan Wu <alanwu@ruby-lang.org>
This commit is contained in:
Chris Seaton 2022-06-14 16:08:36 +01:00 committed by Alan Wu
parent 5ca2335802
commit 31b2cd38c5
Notes: git 2022-06-21 06:57:49 +09:00
6 changed files with 16 additions and 20 deletions

View file

@ -82,7 +82,7 @@ static struct {
st_table *id2enum, *enum2id; st_table *id2enum, *enum2id;
} warning_categories; } warning_categories;
extern const char ruby_description[]; extern const char *rb_dynamic_description;
static const char * static const char *
rb_strerrno(int err) rb_strerrno(int err)
@ -730,7 +730,7 @@ bug_report_begin_valist(FILE *out, const char *fmt, va_list args)
fputs("[BUG] ", out); fputs("[BUG] ", out);
vsnprintf(buf, sizeof(buf), fmt, args); vsnprintf(buf, sizeof(buf), fmt, args);
fputs(buf, out); fputs(buf, out);
snprintf(buf, sizeof(buf), "\n%s\n\n", ruby_description); snprintf(buf, sizeof(buf), "\n%s\n\n", rb_dynamic_description);
fputs(buf, out); fputs(buf, out);
preface_dump(out); preface_dump(out);
} }
@ -866,7 +866,7 @@ rb_async_bug_errno(const char *mesg, int errno_arg)
write_or_abort(2, errno_str, strlen(errno_str)); write_or_abort(2, errno_str, strlen(errno_str));
} }
WRITE_CONST(2, "\n\n"); WRITE_CONST(2, "\n\n");
write_or_abort(2, ruby_description, strlen(ruby_description)); write_or_abort(2, rb_dynamic_description, strlen(rb_dynamic_description));
abort(); abort();
} }
@ -882,7 +882,7 @@ rb_assert_failure(const char *file, int line, const char *name, const char *expr
FILE *out = stderr; FILE *out = stderr;
fprintf(out, "Assertion Failed: %s:%d:", file, line); fprintf(out, "Assertion Failed: %s:%d:", file, line);
if (name) fprintf(out, "%s:", name); if (name) fprintf(out, "%s:", name);
fprintf(out, "%s\n%s\n\n", expr, ruby_description); fprintf(out, "%s\n%s\n\n", expr, rb_dynamic_description);
preface_dump(out); preface_dump(out);
rb_vm_bugreport(NULL); rb_vm_bugreport(NULL);
bug_report_end(out); bug_report_end(out);

View file

@ -137,7 +137,8 @@ RUBY_EXTERN const int ruby_patchlevel;
/** /**
* This is what `ruby -v` prints to the standard error. Something like: * This is what `ruby -v` prints to the standard error. Something like:
* `"ruby 2.5.9p229 (2021-04-05 revision 67829) [x86_64-linux]"` * `"ruby 2.5.9p229 (2021-04-05 revision 67829) [x86_64-linux]"`. This doesn't
* include runtime options like a JIT being enabled.
*/ */
RUBY_EXTERN const char ruby_description[]; RUBY_EXTERN const char ruby_description[];

6
ruby.c
View file

@ -1826,10 +1826,11 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
rb_yjit_init(); rb_yjit_init();
#endif #endif
} }
if (opt->dump & (DUMP_BIT(version) | DUMP_BIT(version_v))) {
#if USE_MJIT #if USE_MJIT
mjit_opts.on = opt->mjit.on; /* used by ruby_show_version(). mjit_init() still can't be called here. */ mjit_opts.on = opt->mjit.on; /* used by Init_ruby_description(). mjit_init() still can't be called here. */
#endif #endif
Init_ruby_description();
if (opt->dump & (DUMP_BIT(version) | DUMP_BIT(version_v))) {
ruby_show_version(); ruby_show_version();
if (opt->dump & DUMP_BIT(version)) return Qtrue; if (opt->dump & DUMP_BIT(version)) return Qtrue;
} }
@ -1888,7 +1889,6 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
mjit_init(&opt->mjit); mjit_init(&opt->mjit);
#endif #endif
Init_ruby_description();
Init_enc(); Init_enc();
lenc = rb_locale_encoding(); lenc = rb_locale_encoding();
rb_enc_associate(rb_progname, lenc); rb_enc_associate(rb_progname, lenc);

View file

@ -7,8 +7,6 @@ class TestBugReporter < Test::Unit::TestCase
omit if ENV['RUBY_ON_BUG'] omit if ENV['RUBY_ON_BUG']
description = RUBY_DESCRIPTION description = RUBY_DESCRIPTION
description = description.sub(/\+MJIT /, '') if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
description = description.sub(/\+YJIT /, '') if defined?(RubyVM::YJIT.enabled?) && RubyVM::YJIT.enabled?
expected_stderr = [ expected_stderr = [
:*, :*,
/\[BUG\]\sSegmentation\sfault.*\n/, /\[BUG\]\sSegmentation\sfault.*\n/,

View file

@ -740,7 +740,7 @@ class TestRubyOptions < Test::Unit::TestCase
-e:(?:1:)?\s\[BUG\]\sSegmentation\sfault.*\n -e:(?:1:)?\s\[BUG\]\sSegmentation\sfault.*\n
)x, )x,
%r( %r(
#{ Regexp.quote(NO_JIT_DESCRIPTION) }\n\n #{ Regexp.quote(RUBY_DESCRIPTION) }\n\n
)x, )x,
%r( %r(
(?:--\s(?:.+\n)*\n)? (?:--\s(?:.+\n)*\n)?

View file

@ -47,6 +47,9 @@ static const char ruby_description_with_yjit[] = RUBY_DESCRIPTION_WITH(" +YJIT")
const char ruby_copyright[] = RUBY_COPYRIGHT; const char ruby_copyright[] = RUBY_COPYRIGHT;
const char ruby_engine[] = "ruby"; const char ruby_engine[] = "ruby";
// Might change after initialization
const char *rb_dynamic_description = ruby_description;
/*! Defines platform-depended Ruby-level constants */ /*! Defines platform-depended Ruby-level constants */
void void
Init_version(void) Init_version(void)
@ -104,9 +107,11 @@ Init_ruby_description(void)
VALUE description; VALUE description;
if (MJIT_OPTS_ON) { if (MJIT_OPTS_ON) {
rb_dynamic_description = ruby_description_with_mjit;
description = MKSTR(description_with_mjit); description = MKSTR(description_with_mjit);
} }
else if (rb_yjit_enabled_p()) { else if (rb_yjit_enabled_p()) {
rb_dynamic_description = ruby_description_with_yjit;
description = MKSTR(description_with_yjit); description = MKSTR(description_with_yjit);
} }
else { else {
@ -122,15 +127,7 @@ Init_ruby_description(void)
void void
ruby_show_version(void) ruby_show_version(void)
{ {
if (MJIT_OPTS_ON) { puts(rb_dynamic_description);
PRINT(description_with_mjit);
}
else if (rb_yjit_enabled_p()) {
PRINT(description_with_yjit);
}
else {
PRINT(description);
}
#ifdef RUBY_LAST_COMMIT_TITLE #ifdef RUBY_LAST_COMMIT_TITLE
fputs("last_commit=" RUBY_LAST_COMMIT_TITLE, stdout); fputs("last_commit=" RUBY_LAST_COMMIT_TITLE, stdout);