mixDigest(digest,key,sdslen(key));
- /* Make sure the key is loaded if VM is active */
o = dictGetVal(de);
aux = htonl(o->type);
}
/* Logs the stack trace using the backtrace() call. */
-void logStackTrace(ucontext_t *uc) {
+sds getStackTrace(ucontext_t *uc) {
void *trace[100];
int i, trace_size = 0;
char **messages = NULL;
+ sds st = sdsempty();
/* Generate the stack trace */
trace_size = backtrace(trace, 100);
trace[1] = getMcontextEip(uc);
}
messages = backtrace_symbols(trace, trace_size);
- redisLog(REDIS_WARNING, "--- STACK TRACE");
- for (i=1; i<trace_size; ++i)
- redisLog(REDIS_WARNING,"%s", messages[i]);
+ for (i=1; i<trace_size; ++i) {
+ st = sdscat(st,messages[i]);
+ st = sdscatlen(st,"\n",1);
+ }
+ zlibc_free(messages);
+ return st;
}
/* Log information about the "current" client, that is, the client that is
void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
ucontext_t *uc = (ucontext_t*) secret;
- sds infostring, clients;
+ sds infostring, clients, st;
struct sigaction act;
REDIS_NOTUSED(info);
server.assert_file, server.assert_line);
/* Log the stack trace */
- logStackTrace(uc);
+ st = getStackTrace(uc);
+ redisLog(REDIS_WARNING, "--- STACK TRACE\n%s", st);
+ sdsfree(st);
/* Log INFO and CLIENT LIST */
redisLog(REDIS_WARNING, "--- INFO OUTPUT");
ucontext_t *uc = (ucontext_t*) secret;
REDIS_NOTUSED(info);
REDIS_NOTUSED(sig);
+ sds st, log;
- /* Log INFO and CLIENT LIST */
- redisLog(REDIS_WARNING, "--- WATCHDOG TIMER EXPIRED ---");
+ log = sdsnew("\n--- WATCHDOG TIMER EXPIRED ---\n");
#ifdef HAVE_BACKTRACE
- logStackTrace(uc);
- redisLog(REDIS_WARNING, "------");
+ st = getStackTrace(uc);
+#else
+ st = sdsnew("Sorry: no support for backtrace().\n");
#endif
+ log = sdscatsds(log,st);
+ log = sdscat(log,"------\n");
+ redisLogFromHandler(REDIS_WARNING,log);
+ sdsfree(st);
+ sdsfree(log);
}
/* Schedule a SIGALRM delivery after the specified period in milliseconds.
/* Will stop the timer if period is 0. */
it.it_value.tv_sec = period/1000;
- it.it_value.tv_usec = period%1000;
+ it.it_value.tv_usec = (period%1000)*1000;
/* Don't automatically restart. */
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 0;