initial backtrace dumping on sigsegv/sigbus + debug command
This commit is contained in:
parent
f7acd60336
commit
7f957c925b
2
Makefile
2
Makefile
@ -3,7 +3,7 @@
|
|||||||
# This file is released under the BSD license, see the COPYING file
|
# This file is released under the BSD license, see the COPYING file
|
||||||
|
|
||||||
DEBUG?= -g
|
DEBUG?= -g
|
||||||
CFLAGS?= -std=c99 -pedantic -O2 -Wall -W -DSDS_ABORT_ON_OOM
|
CFLAGS?= -std=c99 -pedantic -O -Wall -W -DSDS_ABORT_ON_OOM
|
||||||
CCOPT= $(CFLAGS)
|
CCOPT= $(CFLAGS)
|
||||||
|
|
||||||
OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o
|
OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o
|
||||||
|
28
redis.c
28
redis.c
@ -49,6 +49,7 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <execinfo.h>
|
||||||
|
|
||||||
#include "ae.h" /* Event driven programming library */
|
#include "ae.h" /* Event driven programming library */
|
||||||
#include "sds.h" /* Dynamic safe strings */
|
#include "sds.h" /* Dynamic safe strings */
|
||||||
@ -314,6 +315,7 @@ static time_t getExpire(redisDb *db, robj *key);
|
|||||||
static int setExpire(redisDb *db, robj *key, time_t when);
|
static int setExpire(redisDb *db, robj *key, time_t when);
|
||||||
static void updateSalvesWaitingBgsave(int bgsaveerr);
|
static void updateSalvesWaitingBgsave(int bgsaveerr);
|
||||||
static void freeMemoryIfNeeded(void);
|
static void freeMemoryIfNeeded(void);
|
||||||
|
static void onSigsegv(int sig);
|
||||||
|
|
||||||
static void authCommand(redisClient *c);
|
static void authCommand(redisClient *c);
|
||||||
static void pingCommand(redisClient *c);
|
static void pingCommand(redisClient *c);
|
||||||
@ -371,6 +373,7 @@ static void expireCommand(redisClient *c);
|
|||||||
static void getSetCommand(redisClient *c);
|
static void getSetCommand(redisClient *c);
|
||||||
static void ttlCommand(redisClient *c);
|
static void ttlCommand(redisClient *c);
|
||||||
static void slaveofCommand(redisClient *c);
|
static void slaveofCommand(redisClient *c);
|
||||||
|
static void debugCommand(redisClient *c);
|
||||||
|
|
||||||
/*================================= Globals ================================= */
|
/*================================= Globals ================================= */
|
||||||
|
|
||||||
@ -434,6 +437,7 @@ static struct redisCommand cmdTable[] = {
|
|||||||
{"monitor",monitorCommand,1,REDIS_CMD_INLINE},
|
{"monitor",monitorCommand,1,REDIS_CMD_INLINE},
|
||||||
{"ttl",ttlCommand,2,REDIS_CMD_INLINE},
|
{"ttl",ttlCommand,2,REDIS_CMD_INLINE},
|
||||||
{"slaveof",slaveofCommand,3,REDIS_CMD_INLINE},
|
{"slaveof",slaveofCommand,3,REDIS_CMD_INLINE},
|
||||||
|
{"debug",debugCommand,-2,REDIS_CMD_INLINE},
|
||||||
{NULL,NULL,0,0}
|
{NULL,NULL,0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -890,6 +894,8 @@ static void initServer() {
|
|||||||
|
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
signal(SIGSEGV, onSigsegv);
|
||||||
|
signal(SIGBUS, onSigsegv);
|
||||||
|
|
||||||
server.clients = listCreate();
|
server.clients = listCreate();
|
||||||
server.slaves = listCreate();
|
server.slaves = listCreate();
|
||||||
@ -4048,6 +4054,28 @@ static void freeMemoryIfNeeded(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ================================= Debugging ============================== */
|
||||||
|
|
||||||
|
static void debugCommand(redisClient *c) {
|
||||||
|
if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
|
||||||
|
*((char*)-1) = 'x';
|
||||||
|
} else {
|
||||||
|
addReplySds(c,sdsnew("-ERR Syntax error, try DEBUG SEGFAULT\r\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void onSigsegv(int sig) {
|
||||||
|
void *trace[25];
|
||||||
|
int n = backtrace(trace, 25);
|
||||||
|
char **symbols = backtrace_symbols(trace, n);
|
||||||
|
|
||||||
|
redisLog(REDIS_WARNING,"Got %s!!! Redis crashed, backtrace:",
|
||||||
|
sig == SIGSEGV ? "SIGSEGV" : "SIGBUS");
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
redisLog(REDIS_WARNING,symbols[i]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* =================================== Main! ================================ */
|
/* =================================== Main! ================================ */
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
Loading…
x
Reference in New Issue
Block a user