Esempio n. 1
0
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);
}