mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
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).
This commit is contained in:
parent
e3e6993510
commit
bab205f787
57
src/debug.c
57
src/debug.c
@ -214,7 +214,7 @@ void debugCommand(redisClient *c) {
|
|||||||
*((char*)-1) = 'x';
|
*((char*)-1) = 'x';
|
||||||
} else if (!strcasecmp(c->argv[1]->ptr,"assert")) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"assert")) {
|
||||||
if (c->argc >= 3) c->argv[2] = tryObjectEncoding(c->argv[2]);
|
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")) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"reload")) {
|
||||||
if (rdbSave(server.dbfilename) != REDIS_OK) {
|
if (rdbSave(server.dbfilename) != REDIS_OK) {
|
||||||
addReply(c,shared.err);
|
addReply(c,shared.err);
|
||||||
@ -306,34 +306,45 @@ void _redisAssert(char *estr, char *file, int line) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _redisAssertPrintClientInfo(redisClient *c) {
|
void _redisAssertPrintClientInfo(redisClient *c) {
|
||||||
if (c) {
|
int j;
|
||||||
int j;
|
|
||||||
|
|
||||||
redisLog(REDIS_WARNING,"=== ASSERTION FAILED CLIENT CONTEXT ===");
|
redisLog(REDIS_WARNING,"=== ASSERTION FAILED CLIENT CONTEXT ===");
|
||||||
redisLog(REDIS_WARNING,"client->flags = %d", c->flags);
|
redisLog(REDIS_WARNING,"client->flags = %d", c->flags);
|
||||||
redisLog(REDIS_WARNING,"client->fd = %d", c->fd);
|
redisLog(REDIS_WARNING,"client->fd = %d", c->fd);
|
||||||
redisLog(REDIS_WARNING,"client->argc = %d", c->argc);
|
redisLog(REDIS_WARNING,"client->argc = %d", c->argc);
|
||||||
for (j=0; j < c->argc; j++) {
|
for (j=0; j < c->argc; j++) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
char *arg;
|
char *arg;
|
||||||
|
|
||||||
if (c->argv[j]->type == REDIS_STRING &&
|
if (c->argv[j]->type == REDIS_STRING &&
|
||||||
c->argv[j]->encoding == REDIS_ENCODING_RAW)
|
c->argv[j]->encoding == REDIS_ENCODING_RAW)
|
||||||
{
|
{
|
||||||
arg = (char*) c->argv[j]->ptr;
|
arg = (char*) c->argv[j]->ptr;
|
||||||
} else {
|
} else {
|
||||||
snprintf(buf,sizeof(buf),"Object type: %d, encoding: %d",
|
snprintf(buf,sizeof(buf),"Object type: %d, encoding: %d",
|
||||||
c->argv[j]->type, c->argv[j]->encoding);
|
c->argv[j]->type, c->argv[j]->encoding);
|
||||||
arg = buf;
|
arg = buf;
|
||||||
}
|
|
||||||
redisLog(REDIS_WARNING,"client->argv[%d] = \"%s\" (refcount: %d)",
|
|
||||||
j, arg, c->argv[j]->refcount);
|
|
||||||
}
|
}
|
||||||
|
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) {
|
void _redisAssertPrintObject(robj *o) {
|
||||||
_redisAssertPrintClientInfo(c);
|
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 _redisAssertWithInfo(redisClient *c, robj *o, char *estr, char *file, int line) {
|
||||||
|
if (c) _redisAssertPrintClientInfo(c);
|
||||||
|
if (o) _redisAssertPrintObject(o);
|
||||||
_redisAssert(estr,file,line);
|
_redisAssert(estr,file,line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@
|
|||||||
#define REDIS_LUA_TIME_LIMIT 60000 /* milliseconds */
|
#define REDIS_LUA_TIME_LIMIT 60000 /* milliseconds */
|
||||||
|
|
||||||
/* We can print the stacktrace, so our assert is defined this way: */
|
/* 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 redisAssert(_e) ((_e)?(void)0 : (_redisAssert(#_e,__FILE__,__LINE__),_exit(1)))
|
||||||
#define redisPanic(_e) _redisPanic(#_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
|
#endif
|
||||||
|
|
||||||
/* Debugging stuff */
|
/* 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 _redisAssert(char *estr, char *file, int line);
|
||||||
void _redisPanic(char *msg, char *file, int line);
|
void _redisPanic(char *msg, char *file, int line);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user