Respect RUBY_CRASH_REPORT path when RUBY_ASSERT() fails

Previously, it always used stderr. Slight shuffle of the first line
of the crash due to reusing code from rb_bug():

```diff
-Assertion Failed: /ruby/object.c:649:rb_obj_itself:false
+/ruby/object.c:649: Assertion Failed: rb_obj_itself:false
```

Tested locally to confirm that it writes to the file given with
RUBY_CRASH_REPORT. Follow-up for [Feature #19790].
This commit is contained in:
Alan Wu 2024-11-07 09:35:19 -05:00 committed by GitHub
parent 3f7c72cd33
commit fca07d73e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
Notes: git 2024-11-07 14:35:38 +00:00
Merged: https://github.com/ruby/ruby/pull/12019

Merged-By: XrXr

32
error.c
View File

@ -1173,23 +1173,27 @@ void
rb_assert_failure_detail(const char *file, int line, const char *name, const char *expr,
const char *fmt, ...)
{
FILE *out = stderr;
fprintf(out, "Assertion Failed: %s:%d:", file, line);
if (name) fprintf(out, "%s:", name);
fputs(expr, out);
rb_pid_t pid = -1;
FILE *out = bug_report_file(file, line, &pid);
if (out) {
fputs("Assertion Failed: ", out);
if (name) fprintf(out, "%s:", name);
fputs(expr, out);
if (fmt && *fmt) {
va_list args;
va_start(args, fmt);
fputs(": ", out);
vfprintf(out, fmt, args);
va_end(args);
if (fmt && *fmt) {
va_list args;
va_start(args, fmt);
fputs(": ", out);
vfprintf(out, fmt, args);
va_end(args);
}
fprintf(out, "\n%s\n\n", rb_dynamic_description);
preface_dump(out);
rb_vm_bugreport(NULL, out);
bug_report_end(out, pid);
}
fprintf(out, "\n%s\n\n", rb_dynamic_description);
preface_dump(out);
rb_vm_bugreport(NULL, out);
bug_report_end(out, -1);
die();
}