mirror of
https://github.com/fluencelabs/redis
synced 2025-03-17 16:10:50 +00:00
Introduced a redisAssert() variant that is able to show information about the client in the context where the failed assertion was detected.
This commit is contained in:
parent
909aee2c6c
commit
e3e6993510
35
src/debug.c
35
src/debug.c
@ -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");
|
||||
|
@ -211,10 +211,9 @@
|
||||
#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
|
||||
|
Loading…
x
Reference in New Issue
Block a user