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); }
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'; }
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'; }
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'; }
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); } }
void _prezAssertPrintObject(robj *o) { bugReportStart(); prezLog(PREZ_WARNING,"=== ASSERTION FAILED OBJECT CONTEXT ==="); prezLogObjectDebugInfo(o); }
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); }
void _serverAssertPrintObject(robj *o) { bugReportStart(); serverLog(LL_WARNING,"=== ASSERTION FAILED OBJECT CONTEXT ==="); serverLogObjectDebugInfo(o); }