From: antirez Date: Tue, 4 Oct 2011 16:05:26 +0000 (+0200) Subject: redisAssertWithClientInfo() is now redisAssertWithInfo() that is also able to report... X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/bab205f787afcb37e5b5a5d1eb16c8fafef6f95d?ds=inline redisAssertWithClientInfo() is now redisAssertWithInfo() that is also able to report an optional object. The client is also optional. Specifying NULL will prevent dumping the not available information (either client or object). --- diff --git a/src/debug.c b/src/debug.c index 0ef27ba1..05181912 100644 --- a/src/debug.c +++ b/src/debug.c @@ -214,7 +214,7 @@ void debugCommand(redisClient *c) { *((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); + redisAssertWithInfo(c,c->argv[0],1 == 2); } else if (!strcasecmp(c->argv[1]->ptr,"reload")) { if (rdbSave(server.dbfilename) != REDIS_OK) { addReply(c,shared.err); @@ -306,34 +306,45 @@ void _redisAssert(char *estr, char *file, int line) { } void _redisAssertPrintClientInfo(redisClient *c) { - if (c) { - int j; + 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); + 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 _redisAssertPrintObject(robj *o) { + redisLog(REDIS_WARNING,"=== ASSERTION FAILED OBJECT CONTEXT ==="); + redisLog(REDIS_WARNING,"Object type: %d", o->type); + redisLog(REDIS_WARNING,"Object encoding: %d", o->encoding); + redisLog(REDIS_WARNING,"Object refcount: %d", o->refcount); + if (o->type == REDIS_STRING && o->encoding == REDIS_ENCODING_RAW) { + redisLog(REDIS_WARNING,"Object raw string len: %d", sdslen(o->ptr)); + if (sdslen(o->ptr) < 4096) + redisLog(REDIS_WARNING,"Object raw string content: \"%s\"", (char*)o->ptr); } } -void _redisAssertWithClientInfo(redisClient *c, char *estr, char *file, int line) { - _redisAssertPrintClientInfo(c); +void _redisAssertWithInfo(redisClient *c, robj *o, char *estr, char *file, int line) { + if (c) _redisAssertPrintClientInfo(c); + if (o) _redisAssertPrintObject(o); _redisAssert(estr,file,line); } diff --git a/src/redis.h b/src/redis.h index 875f9afe..55c47338 100644 --- a/src/redis.h +++ b/src/redis.h @@ -211,7 +211,7 @@ #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 redisAssertWithInfo(_c,_o,_e) ((_e)?(void)0 : (_redisAssertWithInfo(_c,_o,#_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) @@ -1119,7 +1119,7 @@ void *realloc(void *ptr, size_t size) __attribute__ ((deprecated)); #endif /* Debugging stuff */ -void _redisAssertWithClientInfo(redisClient *c, char *estr, char *file, int line); +void _redisAssertWithInfo(redisClient *c, robj *o, char *estr, char *file, int line); void _redisAssert(char *estr, char *file, int line); void _redisPanic(char *msg, char *file, int line);