]> git.saurik.com Git - redis.git/blobdiff - src/debug.c
Even inside #if 0 comments are comments.
[redis.git] / src / debug.c
index 2df913b071d333a3aa764b0b46271c2f61936367..37e6a1f72c17f9ead483c18bdb63bfac964329cc 100644 (file)
@@ -105,7 +105,6 @@ void computeDatasetDigest(unsigned char *final) {
 
             mixDigest(digest,key,sdslen(key));
 
-            /* Make sure the key is loaded if VM is active */
             o = dictGetVal(de);
 
             aux = htonl(o->type);
@@ -559,10 +558,11 @@ void logRegisters(ucontext_t *uc) {
 }
 
 /* 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);
@@ -572,9 +572,12 @@ void logStackTrace(ucontext_t *uc) {
         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
@@ -617,7 +620,7 @@ void logCurrentClient(void) {
 
 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);
 
@@ -629,7 +632,9 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
                         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");
@@ -675,13 +680,19 @@ void watchdogSignalHandler(int sig, siginfo_t *info, void *secret) {
     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.
@@ -692,7 +703,7 @@ void watchdogScheduleSignal(int period) {
 
     /* 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;