void MR_trace_report_raw(int fd) { char buf[80]; /* that ought to be more than long enough */ int ret; if (MR_trace_event_number > 0) { /* ** This means that the executable was compiled with tracing, ** which implies that the user wants trace info on abort. */ if (MR_trace_report_msg != NULL) { do { /* XXX we don't handle successful but partial writes */ ret = write(fd, MR_trace_report_msg, strlen(MR_trace_report_msg)); } while (ret == -1 && MR_is_eintr(errno)); } if (MR_standardize_event_details) { sprintf(buf, "Last trace event was event #E%ld.\n", (long) MR_standardize_event_num(MR_trace_event_number)); } else { sprintf(buf, "Last trace event was event #%ld.\n", (long) MR_trace_event_number); } do { /* XXX we don't handle successful but partial writes */ ret = write(fd, buf, strlen(buf)); } while (ret == -1 && MR_is_eintr(errno)); } }
static void MR_print_dump_stack(void) { const char *msg = "This may have been caused by a stack overflow, due to unbounded recursion.\n"; int ret; do { ret = write(STDERR, msg, strlen(msg)); } while (ret == -1 && MR_is_eintr(errno)); }
static void MR_fatal_abort(void *context, const char *main_msg, int dump) { char *context_msg; int ret; context_msg = MR_explain_context(context); do { ret = write(STDERR, main_msg, strlen(main_msg)); } while (ret == -1 && MR_is_eintr(errno)); do { ret = write(STDERR, context_msg, strlen(context_msg)); } while (ret == -1 && MR_is_eintr(errno)); MR_trace_report_raw(STDERR); if (dump) { MR_print_dump_stack(); } _exit(1); }