mirror of
https://github.com/fluencelabs/redis
synced 2025-04-01 23:31:03 +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) {
|
void debugCommand(redisClient *c) {
|
||||||
if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
|
if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
|
||||||
*((char*)-1) = 'x';
|
*((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")) {
|
} 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);
|
||||||
@ -302,6 +305,38 @@ void _redisAssert(char *estr, char *file, int line) {
|
|||||||
#endif
|
#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) {
|
void _redisPanic(char *msg, char *file, int line) {
|
||||||
redisLog(REDIS_WARNING,"------------------------------------------------");
|
redisLog(REDIS_WARNING,"------------------------------------------------");
|
||||||
redisLog(REDIS_WARNING,"!!! Software Failure. Press left mouse button to continue");
|
redisLog(REDIS_WARNING,"!!! Software Failure. Press left mouse button to continue");
|
||||||
|
@ -211,10 +211,9 @@
|
|||||||
#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 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)
|
||||||
void _redisAssert(char *estr, char *file, int line);
|
|
||||||
void _redisPanic(char *msg, char *file, int line);
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------
|
/*-----------------------------------------------------------------------------
|
||||||
* Data types
|
* Data types
|
||||||
@ -1119,4 +1118,9 @@ void *malloc(size_t size) __attribute__ ((deprecated));
|
|||||||
void *realloc(void *ptr, size_t size) __attribute__ ((deprecated));
|
void *realloc(void *ptr, size_t size) __attribute__ ((deprecated));
|
||||||
#endif
|
#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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user