initial backtrace dumping on sigsegv/sigbus + debug command

This commit is contained in:
antirez 2009-06-04 16:45:57 +02:00
parent f7acd60336
commit 7f957c925b
2 changed files with 29 additions and 1 deletions

View File

@ -3,7 +3,7 @@
# This file is released under the BSD license, see the COPYING file
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)
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
View File

@ -49,6 +49,7 @@
#include <sys/time.h>
#include <sys/resource.h>
#include <limits.h>
#include <execinfo.h>
#include "ae.h" /* Event driven programming library */
#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 void updateSalvesWaitingBgsave(int bgsaveerr);
static void freeMemoryIfNeeded(void);
static void onSigsegv(int sig);
static void authCommand(redisClient *c);
static void pingCommand(redisClient *c);
@ -371,6 +373,7 @@ static void expireCommand(redisClient *c);
static void getSetCommand(redisClient *c);
static void ttlCommand(redisClient *c);
static void slaveofCommand(redisClient *c);
static void debugCommand(redisClient *c);
/*================================= Globals ================================= */
@ -434,6 +437,7 @@ static struct redisCommand cmdTable[] = {
{"monitor",monitorCommand,1,REDIS_CMD_INLINE},
{"ttl",ttlCommand,2,REDIS_CMD_INLINE},
{"slaveof",slaveofCommand,3,REDIS_CMD_INLINE},
{"debug",debugCommand,-2,REDIS_CMD_INLINE},
{NULL,NULL,0,0}
};
@ -890,6 +894,8 @@ static void initServer() {
signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
signal(SIGSEGV, onSigsegv);
signal(SIGBUS, onSigsegv);
server.clients = 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! ================================ */
#ifdef __linux__