summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--error.c71
-rw-r--r--test/ruby/test_rubyoptions.rb5
-rw-r--r--vm_dump.c70
3 files changed, 75 insertions, 71 deletions
diff --git a/error.c b/error.c
index e03a4eea39..13d6f85b61 100644
--- a/error.c
+++ b/error.c
@@ -336,6 +336,72 @@ bug_report_file(const char *file, int line)
return NULL;
}
+FUNC_MINIMIZED(static void bug_important_message(FILE *out, const char *const msg, size_t len));
+
+static void
+bug_important_message(FILE *out, const char *const msg, size_t len)
+{
+ const char *const endmsg = msg + len;
+ const char *p = msg;
+
+ if (!len) return;
+ if (isatty(fileno(out))) {
+ static const char red[] = "\033[;31;1;7m";
+ static const char green[] = "\033[;32;7m";
+ static const char reset[] = "\033[m";
+ const char *e = strchr(p, '\n');
+ const int w = (int)(e - p);
+ do {
+ int i = (int)(e - p);
+ fputs(*p == ' ' ? green : red, out);
+ fwrite(p, 1, e - p, out);
+ for (; i < w; ++i) fputc(' ', out);
+ fputs(reset, out);
+ fputc('\n', out);
+ } while ((p = e + 1) < endmsg && (e = strchr(p, '\n')) != 0 && e > p + 1);
+ }
+ fwrite(p, 1, endmsg - p, out);
+}
+
+static void
+preface_dump(FILE *out)
+{
+#if defined __APPLE__
+ static const char msg[] = ""
+ "-- Crash Report log information "
+ "--------------------------------------------\n"
+ " See Crash Report log file under the one of following:\n"
+ " * ~/Library/Logs/CrashReporter\n"
+ " * /Library/Logs/CrashReporter\n"
+ " * ~/Library/Logs/DiagnosticReports\n"
+ " * /Library/Logs/DiagnosticReports\n"
+ " for more details.\n"
+ "Don't forget to include the above Crash Report log file in bug reports.\n"
+ "\n";
+ const size_t msglen = sizeof(msg) - 1;
+#else
+ const char *msg = NULL;
+ const size_t msglen = 0;
+#endif
+ bug_important_message(out, msg, msglen);
+}
+
+static void
+postscript_dump(FILE *out)
+{
+#if defined __APPLE__
+ static const char msg[] = ""
+ "[IMPORTANT]\n"
+ "Don't forget to include the Crash Report log file in bug reports.\n"
+ "\n";
+ const size_t msglen = sizeof(msg) - 1;
+#else
+ const char *msg = NULL;
+ const size_t msglen = 0;
+#endif
+ bug_important_message(out, msg, msglen);
+}
+
static void
bug_report_begin_valist(FILE *out, const char *fmt, va_list args)
{
@@ -346,6 +412,7 @@ bug_report_begin_valist(FILE *out, const char *fmt, va_list args)
fputs(buf, out);
snprintf(buf, sizeof(buf), "\n%s\n\n", ruby_description);
fputs(buf, out);
+ preface_dump(out);
}
#define bug_report_begin(out, fmt) do { \
@@ -366,7 +433,8 @@ bug_report_end(FILE *out)
(*reporter->func)(out, reporter->data);
}
}
- fprintf(out, REPORTBUG_MSG);
+ fputs(REPORTBUG_MSG, out);
+ postscript_dump(out);
}
#define report_bug(file, line, fmt, ctx) do { \
@@ -487,6 +555,7 @@ rb_assert_failure(const char *file, int line, const char *name, const char *expr
fprintf(out, "Assertion Failed: %s:%d:", file, line);
if (name) fprintf(out, "%s:", name);
fprintf(out, "%s\n%s\n\n", expr, ruby_description);
+ preface_dump(out);
rb_vm_bugreport(NULL);
bug_report_end(out);
die();
diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb
index 2e5f76d692..0d468ca334 100644
--- a/test/ruby/test_rubyoptions.rb
+++ b/test/ruby/test_rubyoptions.rb
@@ -587,6 +587,11 @@ class TestRubyOptions < Test::Unit::TestCase
(?:.*\n)?
For\sdetails:\shttp:\/\/.*\.ruby-lang\.org/.*\n
\n
+ (?:
+ \[IMPORTANT\]\n
+ .*\n
+ \n
+ )?
)x,
]
ExpectedStderrList << additional if additional
diff --git a/vm_dump.c b/vm_dump.c
index 4847e82a33..c381e13ecc 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -922,72 +922,6 @@ rb_dump_machine_register(const ucontext_t *ctx)
# define rb_dump_machine_register(ctx) ((void)0)
#endif /* HAVE_PRINT_MACHINE_REGISTERS */
-FUNC_MINIMIZED(static void bug_important_message(FILE *out, const char *const msg, size_t len));
-
-static void
-bug_important_message(FILE *out, const char *const msg, size_t len)
-{
- const char *const endmsg = msg + len;
- const char *p = msg;
-
- if (!len) return;
- if (isatty(fileno(out))) {
- static const char red[] = "\033[;31;1;7m";
- static const char green[] = "\033[;32;7m";
- static const char reset[] = "\033[m";
- const char *e = strchr(p, '\n');
- const int w = (int)(e - p);
- do {
- int i = (int)(e - p);
- fputs(*p == ' ' ? green : red, out);
- fwrite(p, 1, e - p, out);
- for (; i < w; ++i) fputc(' ', out);
- fputs(reset, out);
- fputc('\n', out);
- } while ((p = e + 1) < endmsg && (e = strchr(p, '\n')) != 0 && e > p + 1);
- }
- fwrite(p, 1, endmsg - p, out);
-}
-
-static void
-preface_dump(void)
-{
-#if defined __APPLE__
- static const char msg[] = ""
- "-- Crash Report log information "
- "--------------------------------------------\n"
- " See Crash Report log file under the one of following:\n"
- " * ~/Library/Logs/CrashReporter\n"
- " * /Library/Logs/CrashReporter\n"
- " * ~/Library/Logs/DiagnosticReports\n"
- " * /Library/Logs/DiagnosticReports\n"
- " for more details.\n"
- "Don't forget to include the above Crash Report log file in bug reports.\n"
- "\n";
- const size_t msglen = sizeof(msg) - 1;
-#else
- const char *msg = NULL;
- const size_t msglen = 0;
-#endif
- bug_important_message(stderr, msg, msglen);
-}
-
-static void
-postscript_dump(void)
-{
-#if defined __APPLE__
- static const char msg[] = ""
- "[IMPORTANT]\n"
- "Don't forget to include the Crash Report log file in bug reports.\n"
- "\n";
- const size_t msglen = sizeof(msg) - 1;
-#else
- const char *msg = NULL;
- const size_t msglen = 0;
-#endif
- bug_important_message(stderr, msg, msglen);
-}
-
void
rb_vm_bugreport(const void *ctx)
{
@@ -1001,8 +935,6 @@ rb_vm_bugreport(const void *ctx)
#endif
const rb_vm_t *const vm = GET_VM();
- preface_dump();
-
if (vm) {
SDR();
rb_backtrace_print_as_bugreport();
@@ -1109,6 +1041,4 @@ rb_vm_bugreport(const void *ctx)
}
#endif /* __FreeBSD__ */
}
-
- postscript_dump();
}