Example #1
0
File: debug.c Project: guoyu07/Prez
void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
    ucontext_t *uc = (ucontext_t*) secret;
    struct sigaction act;
    PREZ_NOTUSED(info);

    bugReportStart();
    prezLog(PREZ_WARNING,
        "    prez %s crashed by signal: %d", PREZ_VERSION, sig);
    prezLog(PREZ_WARNING,
        "    Failed assertion: %s (%s:%d)", server.assert_failed,
                        server.assert_file, server.assert_line);

    /* Log the stack trace */
    prezLog(PREZ_WARNING, "--- STACK TRACE");
    logStackTrace(uc);

    /* Log dump of processor registers */
    logRegisters(uc);

    prezLog(PREZ_WARNING,
"\n=== PREZ BUG REPORT END. Make sure to include from START to END. ===\n\n"
);
    /* free(messages); Don't call free() with possibly corrupted memory. */
    if (server.daemonize) unlink(server.pidfile);

    /* Make sure we exit with the right signal at the end. So for instance
     * the core will be dumped if enabled. */
    sigemptyset (&act.sa_mask);
    act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
    act.sa_handler = SIG_DFL;
    sigaction (sig, &act, NULL);
    kill(getpid(),sig);
}
Example #2
0
void _ugAssert(char *estr, char *file, int line) {
    bugReportStart();
    LOG_WARNING("=== ASSERTION FAILED ===");
    LOG_WARNING("==> %s:%d '%s' is not true",file,line,estr);
#ifdef HAVE_BACKTRACE
    LOG_WARNING("(forcing SIGSEGV in order to print the stack trace)");
#endif
    *((char *)-1) = 'x';
}
Example #3
0
void _ugPanic(char *msg, char *file, int line) {
    bugReportStart();
    LOG_WARNING("------------------------------------------------");
    LOG_WARNING("!!! Software Failure. Press left mouse button to continue");
    LOG_WARNING("Guru Meditation: %s #%s:%d",msg,file,line);
#ifdef HAVE_BACKTRACE
    LOG_WARNING("(forcing SIGSEGV in order to print the stack trace)");
#endif
    LOG_WARNING("------------------------------------------------");
    *((char *)-1) = 'x';
}
Example #4
0
File: debug.c Project: guoyu07/Prez
void _prezAssert(char *estr, char *file, int line) {
    bugReportStart();
    prezLog(PREZ_WARNING,"=== ASSERTION FAILED ===");
    prezLog(PREZ_WARNING,"==> %s:%d '%s' is not true",file,line,estr);
#ifdef HAVE_BACKTRACE
    server.assert_failed = estr;
    server.assert_file = file;
    server.assert_line = line;
    prezLog(PREZ_WARNING,"(forcing SIGSEGV to print the bug report.)");
#endif
    *((char*)-1) = 'x';
}
Example #5
0
File: debug.c Project: guoyu07/Prez
void _prezAssertPrintClientInfo(prezClient *c) {
    int j;

    bugReportStart();
    prezLog(PREZ_WARNING,"=== ASSERTION FAILED CLIENT CONTEXT ===");
    //prezLog(PREZ_WARNING,"client->flags = %d", c->flags);
    prezLog(PREZ_WARNING,"client->fd = %d", c->fd);
    prezLog(PREZ_WARNING,"client->argc = %d", c->argc);
    for (j=0; j < c->argc; j++) {
        char buf[128];
        char *arg;

        if (c->argv[j]->type == PREZ_STRING && sdsEncodedObject(c->argv[j])) {
            arg = (char*) c->argv[j]->ptr;
        } else {
            snprintf(buf,sizeof(buf),"Object type: %d, encoding: %d",
                c->argv[j]->type, c->argv[j]->encoding);
            arg = buf;
        }
        prezLog(PREZ_WARNING,"client->argv[%d] = \"%s\" (refcount: %d)",
            j, arg, c->argv[j]->refcount);
    }
}
Example #6
0
File: debug.c Project: guoyu07/Prez
void _prezAssertPrintObject(robj *o) {
    bugReportStart();
    prezLog(PREZ_WARNING,"=== ASSERTION FAILED OBJECT CONTEXT ===");
    prezLogObjectDebugInfo(o);
}
Example #7
0
void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
    ucontext_t *uc = (ucontext_t*) secret;
    sds infostring, clients;
    struct sigaction act;
    UNUSED(info);

    bugReportStart();
    serverLog(LL_WARNING,
              "    Disque %s crashed by signal: %d", DISQUE_VERSION, sig);
    serverLog(LL_WARNING,
              "    Failed assertion: %s (%s:%d)", server.assert_failed,
              server.assert_file, server.assert_line);

    /* Log the stack trace */
    serverLog(LL_WARNING, "--- STACK TRACE");
    logStackTrace(uc);

    /* Log INFO and CLIENT LIST */
    serverLog(LL_WARNING, "--- INFO OUTPUT");
    infostring = genDisqueInfoString("all");
    infostring = sdscatprintf(infostring, "hash_init_value: %u\n",
                              dictGetHashFunctionSeed());
    serverLogRaw(LL_WARNING, infostring);
    serverLog(LL_WARNING, "--- CLIENT LIST OUTPUT");
    clients = getAllClientsInfoString();
    serverLogRaw(LL_WARNING, clients);
    sdsfree(infostring);
    sdsfree(clients);

    /* Log the current client */
    logCurrentClient();

    /* Log dump of processor registers */
    logRegisters(uc);

#if defined(HAVE_PROC_MAPS)
    /* Test memory */
    serverLog(LL_WARNING, "--- FAST MEMORY TEST");
    bioKillThreads();
    if (memtest_test_linux_anonymous_maps()) {
        serverLog(LL_WARNING,
                  "!!! MEMORY ERROR DETECTED! Check your memory ASAP !!!");
    } else {
        serverLog(LL_WARNING,
                  "Fast memory test PASSED, however your memory can still be broken. Please run a memory test for several hours if possible.");
    }
#endif

    serverLog(LL_WARNING,
              "\n=== DISQUE BUG REPORT END. Make sure to include from START to END. ===\n\n"
              "       Please report the crash by opening an issue on github:\n\n"
              "           http://github.com/antirez/disque/issues\n\n"
              "  Suspect RAM error? Use disque-server --test-memory to verify it.\n\n"
             );
    /* free(messages); Don't call free() with possibly corrupted memory. */
    if (server.daemonize) unlink(server.pidfile);

    /* Make sure we exit with the right signal at the end. So for instance
     * the core will be dumped if enabled. */
    sigemptyset (&act.sa_mask);
    act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
    act.sa_handler = SIG_DFL;
    sigaction (sig, &act, NULL);
    kill(getpid(),sig);
}
Example #8
0
void _serverAssertPrintObject(robj *o) {
    bugReportStart();
    serverLog(LL_WARNING,"=== ASSERTION FAILED OBJECT CONTEXT ===");
    serverLogObjectDebugInfo(o);
}