]> git.saurik.com Git - redis.git/commitdiff
Introduced a redisAssert() variant that is able to show information about the client...
authorantirez <antirez@gmail.com>
Tue, 4 Oct 2011 15:22:29 +0000 (17:22 +0200)
committerantirez <antirez@gmail.com>
Tue, 4 Oct 2011 15:22:29 +0000 (17:22 +0200)
src/debug.c
src/redis.h

index 966e0eb403901770c46403665259881bf5b3b62a..0ef27ba1cbe443c62662bacb6ecf8d75def64f8f 100644 (file)
@@ -212,6 +212,9 @@ void computeDatasetDigest(unsigned char *final) {
 void debugCommand(redisClient *c) {
     if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
         *((char*)-1) = 'x';
+    } else if (!strcasecmp(c->argv[1]->ptr,"assert")) {
+        if (c->argc >= 3) c->argv[2] = tryObjectEncoding(c->argv[2]);
+        redisAssertWithClientInfo(c,1 == 2);
     } else if (!strcasecmp(c->argv[1]->ptr,"reload")) {
         if (rdbSave(server.dbfilename) != REDIS_OK) {
             addReply(c,shared.err);
@@ -302,6 +305,38 @@ void _redisAssert(char *estr, char *file, int line) {
 #endif
 }
 
+void _redisAssertPrintClientInfo(redisClient *c) {
+    if (c) {
+        int j;
+
+        redisLog(REDIS_WARNING,"=== ASSERTION FAILED CLIENT CONTEXT ===");
+        redisLog(REDIS_WARNING,"client->flags = %d", c->flags);
+        redisLog(REDIS_WARNING,"client->fd = %d", c->fd);
+        redisLog(REDIS_WARNING,"client->argc = %d", c->argc);
+        for (j=0; j < c->argc; j++) {
+            char buf[128];
+            char *arg;
+
+            if (c->argv[j]->type == REDIS_STRING &&
+                c->argv[j]->encoding == REDIS_ENCODING_RAW)
+            {
+                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;
+            }
+            redisLog(REDIS_WARNING,"client->argv[%d] = \"%s\" (refcount: %d)",
+                j, arg, c->argv[j]->refcount);
+        }
+    }
+}
+
+void _redisAssertWithClientInfo(redisClient *c, char *estr, char *file, int line) {
+    _redisAssertPrintClientInfo(c);
+    _redisAssert(estr,file,line);
+}
+
 void _redisPanic(char *msg, char *file, int line) {
     redisLog(REDIS_WARNING,"------------------------------------------------");
     redisLog(REDIS_WARNING,"!!! Software Failure. Press left mouse button to continue");
index ec982ee930fcf95c7992237bb1e43a426e5a4583..875f9afe55bb99ba7098543479f35c3dd244aacb 100644 (file)
 #define REDIS_LUA_TIME_LIMIT 60000 /* milliseconds */
 
 /* We can print the stacktrace, so our assert is defined this way: */
+#define redisAssertWithClientInfo(_c,_e) ((_e)?(void)0 : (_redisAssertWithClientInfo(_c,#_e,__FILE__,__LINE__),_exit(1)))
 #define redisAssert(_e) ((_e)?(void)0 : (_redisAssert(#_e,__FILE__,__LINE__),_exit(1)))
 #define redisPanic(_e) _redisPanic(#_e,__FILE__,__LINE__),_exit(1)
-void _redisAssert(char *estr, char *file, int line);
-void _redisPanic(char *msg, char *file, int line);
 
 /*-----------------------------------------------------------------------------
  * Data types
@@ -1119,4 +1118,9 @@ void *malloc(size_t size) __attribute__ ((deprecated));
 void *realloc(void *ptr, size_t size) __attribute__ ((deprecated));
 #endif
 
+/* Debugging stuff */
+void _redisAssertWithClientInfo(redisClient *c, char *estr, char *file, int line);
+void _redisAssert(char *estr, char *file, int line);
+void _redisPanic(char *msg, char *file, int line);
+
 #endif