Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
8a82ee0f
Commit
8a82ee0f
authored
Nov 24, 2011
by
antirez
Browse files
better bug report info on crash (backported from unstable)
parent
f4e2abfc
Changes
3
Show whitespace changes
Inline
Side-by-side
src/debug.c
View file @
8a82ee0f
...
@@ -337,15 +337,20 @@ void debugCommand(redisClient *c) {
...
@@ -337,15 +337,20 @@ void debugCommand(redisClient *c) {
}
}
void
_redisAssert
(
char
*
estr
,
char
*
file
,
int
line
)
{
void
_redisAssert
(
char
*
estr
,
char
*
file
,
int
line
)
{
bugReportStart
();
redisLog
(
REDIS_WARNING
,
"=== ASSERTION FAILED ==="
);
redisLog
(
REDIS_WARNING
,
"=== ASSERTION FAILED ==="
);
redisLog
(
REDIS_WARNING
,
"==> %s:%d '%s' is not true"
,
file
,
line
,
estr
);
redisLog
(
REDIS_WARNING
,
"==> %s:%d '%s' is not true"
,
file
,
line
,
estr
);
#ifdef HAVE_BACKTRACE
#ifdef HAVE_BACKTRACE
redisLog
(
REDIS_WARNING
,
"(forcing SIGSEGV in order to print the stack trace)"
);
server
.
assert_failed
=
estr
;
server
.
assert_file
=
file
;
server
.
assert_line
=
line
;
redisLog
(
REDIS_WARNING
,
"(forcing SIGSEGV to print the bug report.)"
);
*
((
char
*
)
-
1
)
=
'x'
;
*
((
char
*
)
-
1
)
=
'x'
;
#endif
#endif
}
}
void
_redisPanic
(
char
*
msg
,
char
*
file
,
int
line
)
{
void
_redisPanic
(
char
*
msg
,
char
*
file
,
int
line
)
{
bugReportStart
();
redisLog
(
REDIS_WARNING
,
"!!! Software Failure. Press left mouse button to continue"
);
redisLog
(
REDIS_WARNING
,
"!!! Software Failure. Press left mouse button to continue"
);
redisLog
(
REDIS_WARNING
,
"Guru Meditation: %s #%s:%d"
,
msg
,
file
,
line
);
redisLog
(
REDIS_WARNING
,
"Guru Meditation: %s #%s:%d"
,
msg
,
file
,
line
);
#ifdef HAVE_BACKTRACE
#ifdef HAVE_BACKTRACE
...
...
src/redis.c
View file @
8a82ee0f
...
@@ -886,6 +886,12 @@ void initServerConfig() {
...
@@ -886,6 +886,12 @@ void initServerConfig() {
/* Slow log */
/* Slow log */
server
.
slowlog_log_slower_than
=
REDIS_SLOWLOG_LOG_SLOWER_THAN
;
server
.
slowlog_log_slower_than
=
REDIS_SLOWLOG_LOG_SLOWER_THAN
;
server
.
slowlog_max_len
=
REDIS_SLOWLOG_MAX_LEN
;
server
.
slowlog_max_len
=
REDIS_SLOWLOG_MAX_LEN
;
/* Assert */
server
.
assert_failed
=
"<no assertion failed>"
;
server
.
assert_file
=
"<no file>"
;
server
.
assert_line
=
0
;
server
.
bug_report_start
=
0
;
}
}
void
initServer
()
{
void
initServer
()
{
...
@@ -1703,32 +1709,56 @@ static void *getMcontextEip(ucontext_t *uc) {
...
@@ -1703,32 +1709,56 @@ static void *getMcontextEip(ucontext_t *uc) {
#endif
#endif
}
}
void
bugReportStart
(
void
)
{
if
(
server
.
bug_report_start
==
0
)
{
redisLog
(
REDIS_WARNING
,
"=== REDIS BUG REPORT START: Cut & paste starting from here ==="
);
server
.
bug_report_start
=
1
;
}
}
static
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
static
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
void
*
trace
[
100
];
void
*
trace
[
100
];
char
**
messages
=
NULL
;
char
**
messages
=
NULL
;
int
i
,
trace_size
=
0
;
int
i
,
trace_size
=
0
;
ucontext_t
*
uc
=
(
ucontext_t
*
)
secret
;
ucontext_t
*
uc
=
(
ucontext_t
*
)
secret
;
sds
infostring
;
sds
infostring
,
clients
;
struct
sigaction
act
;
struct
sigaction
act
;
REDIS_NOTUSED
(
info
);
REDIS_NOTUSED
(
info
);
bugReportStart
();
redisLog
(
REDIS_WARNING
,
redisLog
(
REDIS_WARNING
,
"======= Ooops! Redis %s got signal: -%d- ======="
,
REDIS_VERSION
,
sig
);
" Redis %s crashed by signal: %d"
,
REDIS_VERSION
,
sig
);
infostring
=
genRedisInfoString
();
redisLog
(
REDIS_WARNING
,
redisLog
(
REDIS_WARNING
,
"%s"
,
infostring
);
" Failed assertion: %s (%s:%d)"
,
server
.
assert_failed
,
/* It's not safe to sdsfree() the returned string under memory
server
.
assert_file
,
server
.
assert_line
);
* corruption conditions. Let it leak as we are going to abort */
/* Generate the stack trace */
trace_size
=
backtrace
(
trace
,
100
);
trace_size
=
backtrace
(
trace
,
100
);
/* overwrite sigaction with caller's address */
/* overwrite sigaction with caller's address */
if
(
getMcontextEip
(
uc
)
!=
NULL
)
{
if
(
getMcontextEip
(
uc
)
!=
NULL
)
{
trace
[
1
]
=
getMcontextEip
(
uc
);
trace
[
1
]
=
getMcontextEip
(
uc
);
}
}
messages
=
backtrace_symbols
(
trace
,
trace_size
);
messages
=
backtrace_symbols
(
trace
,
trace_size
);
redisLog
(
REDIS_WARNING
,
"--- STACK TRACE"
);
for
(
i
=
1
;
i
<
trace_size
;
++
i
)
for
(
i
=
1
;
i
<
trace_size
;
++
i
)
redisLog
(
REDIS_WARNING
,
"%s"
,
messages
[
i
]);
redisLog
(
REDIS_WARNING
,
"%s"
,
messages
[
i
]);
/* Log INFO and CLIENT LIST */
redisLog
(
REDIS_WARNING
,
"--- INFO OUTPUT"
);
infostring
=
genRedisInfoString
();
redisLog
(
REDIS_WARNING
,
infostring
);
redisLog
(
REDIS_WARNING
,
"--- CLIENT LIST OUTPUT"
);
clients
=
getAllClientsInfoString
();
redisLog
(
REDIS_WARNING
,
clients
);
/* Don't sdsfree() strings to avoid a crash. Memory may be corrupted. */
redisLog
(
REDIS_WARNING
,
"=== REDIS BUG REPORT END. Make sure to include from START to END. ===
\n\n
"
" Please report the crash opening an issue on github:
\n\n
"
" http://github.com/antirez/redis/issues
\n\n
"
);
/* free(messages); Don't call free() with possibly corrupted memory. */
/* free(messages); Don't call free() with possibly corrupted memory. */
if
(
server
.
daemonize
)
unlink
(
server
.
pidfile
);
if
(
server
.
daemonize
)
unlink
(
server
.
pidfile
);
...
...
src/redis.h
View file @
8a82ee0f
...
@@ -236,6 +236,7 @@
...
@@ -236,6 +236,7 @@
#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
_redisAssert
(
char
*
estr
,
char
*
file
,
int
line
);
void
_redisPanic
(
char
*
msg
,
char
*
file
,
int
line
);
void
_redisPanic
(
char
*
msg
,
char
*
file
,
int
line
);
void
bugReportStart
(
void
);
/*-----------------------------------------------------------------------------
/*-----------------------------------------------------------------------------
* Data types
* Data types
...
@@ -534,6 +535,11 @@ struct redisServer {
...
@@ -534,6 +535,11 @@ struct redisServer {
/* Misc */
/* Misc */
unsigned
lruclock
:
22
;
/* clock incrementing every minute, for LRU */
unsigned
lruclock
:
22
;
/* clock incrementing every minute, for LRU */
unsigned
lruclock_padding
:
10
;
unsigned
lruclock_padding
:
10
;
/* Assert & bug reportign */
char
*
assert_failed
;
char
*
assert_file
;
int
assert_line
;
int
bug_report_start
;
/* True if bug report header already logged. */
};
};
typedef
struct
pubsubPattern
{
typedef
struct
pubsubPattern
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment