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
"vscode:/vscode.git/clone" did not exist on "6532df2e7eddf3aa791f8c562f8c57baa07b6051"
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