Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
f034a075
Commit
f034a075
authored
Dec 16, 2015
by
antirez
Browse files
Crash report format improvements.
parent
72be072e
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/debug.c
View file @
f034a075
...
@@ -577,8 +577,8 @@ void _serverPanic(char *msg, char *file, int line) {
...
@@ -577,8 +577,8 @@ void _serverPanic(char *msg, char *file, int line) {
void
bugReportStart
(
void
)
{
void
bugReportStart
(
void
)
{
if
(server.bug_report_start
==
0)
{
if
(server.bug_report_start
==
0)
{
serverLog(LL_WARNING,
serverLog
Raw
(LL_WARNING
|LL_RAW
,
"\n\n===
REDIS
BUG
REPORT
START:
Cut
&
paste
starting
from
here
===")
;
"\n\n===
REDIS
BUG
REPORT
START:
Cut
&
paste
starting
from
here
===
\n
")
;
server.bug_report_start
=
1
;
server.bug_report_start
=
1
;
}
}
}
}
...
@@ -629,7 +629,7 @@ void logStackContent(void **sp) {
...
@@ -629,7 +629,7 @@ void logStackContent(void **sp) {
}
}
void
logRegisters
(
ucontext_t
*
uc
)
{
void
logRegisters
(
ucontext_t
*
uc
)
{
serverLog(LL_WARNING
,
"
---
REGISTERS")
;
serverLog(LL_WARNING
|LL_RAW,
"\n--
---
-
REGISTERS
------\n
")
;
/* OSX */
/* OSX */
#if defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
#if defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
...
@@ -760,7 +760,7 @@ void logRegisters(ucontext_t *uc) {
...
@@ -760,7 +760,7 @@ void logRegisters(ucontext_t *uc) {
/* Logs the stack trace using the backtrace() call. This function is designed
/* Logs the stack trace using the backtrace() call. This function is designed
* to be called from signal handlers safely. */
* to be called from signal handlers safely. */
void
logStackTrace
(
ucontext_t
*
uc
)
{
void
logStackTrace
(
ucontext_t
*
uc
)
{
void
*trace[10
0
]
;
void
*trace[10
1
]
;
int
trace_size
=
0,
fd
;
int
trace_size
=
0,
fd
;
int
log_to_stdout
=
server.logfile[0]
==
'\0'
;
int
log_to_stdout
=
server.logfile[0]
==
'\0'
;
...
@@ -771,14 +771,19 @@ void logStackTrace(ucontext_t *uc) {
...
@@ -771,14 +771,19 @@ void logStackTrace(ucontext_t *uc) {
if
(fd
==
-1)
return
;
if
(fd
==
-1)
return
;
/* Generate the stack trace */
/* Generate the stack trace */
trace_size
=
backtrace(trace,
100)
;
trace_size
=
backtrace(trace+1,
100)
;
/* overwrite sigaction with caller's address */
if
(getMcontextEip(uc)
!=
NULL)
{
if
(getMcontextEip(uc)
!=
NULL)
char
*msg1
=
"EIP:\n"
;
trace[1]
=
getMcontextEip(uc)
;
char
*msg2
=
"\nBacktrace:\n"
;
write(fd,msg1,strlen(msg1))
;
trace[0]
=
getMcontextEip(uc)
;
backtrace_symbols_fd(trace,
1,
fd)
;
write(fd,msg2,strlen(msg2))
;
}
/* Write symbols to log file */
/* Write symbols to log file */
backtrace_symbols_fd(trace,
trace_size,
fd)
;
backtrace_symbols_fd(trace
+1
,
trace_size,
fd)
;
/* Cleanup */
/* Cleanup */
if
(!log_to_stdout)
close(fd)
;
if
(!log_to_stdout)
close(fd)
;
...
@@ -794,15 +799,16 @@ void logCurrentClient(void) {
...
@@ -794,15 +799,16 @@ void logCurrentClient(void) {
sds
client
;
sds
client
;
int
j
;
int
j
;
serverLog(LL_WARNING
,
"
---
CURRENT
CLIENT
INFO")
;
serverLog
Raw
(LL_WARNING
|LL_RAW,
"\n---
---
CURRENT
CLIENT
INFO
------\n
")
;
client
=
catClientInfoString(sdsempty(),cc)
;
client
=
catClientInfoString(sdsempty(),cc)
;
serverLog(LL_WARNING
,"client:
%s
",
client)
;
serverLog(LL_WARNING
|LL_RAW,"%s\n
",
client)
;
sdsfree(client)
;
sdsfree(client)
;
for
(j
=
0
;
j
<
cc->argc
;
j++)
{
for
(j
=
0
;
j
<
cc->argc
;
j++)
{
robj
*decoded
;
robj
*decoded
;
decoded
=
getDecodedObject(cc->argv[j])
;
decoded
=
getDecodedObject(cc->argv[j])
;
serverLog(LL_WARNING,"argv[%d]:
'%s'",
j,
(char*)decoded->ptr)
;
serverLog(LL_WARNING|LL_RAW,"argv[%d]:
'%s'\n",
j,
(char*)decoded->ptr)
;
decrRefCount(decoded)
;
decrRefCount(decoded)
;
}
}
/* Check if the first argument, usually a key, is found inside the
/* Check if the first argument, usually a key, is found inside the
...
@@ -907,34 +913,39 @@ int memtest_test_linux_anonymous_maps(void) {
...
@@ -907,34 +913,39 @@ int memtest_test_linux_anonymous_maps(void) {
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
ucontext_t
*uc
=
(ucontext_t*)
secret
;
ucontext_t
*uc
=
(ucontext_t*)
secret
;
void
*eip
=
getMcontextEip(uc)
;
sds
infostring,
clients
;
sds
infostring,
clients
;
struct
sigaction
act
;
struct
sigaction
act
;
UNUSED(info)
;
UNUSED(info)
;
bugReportStart()
;
bugReportStart()
;
serverLog(LL_WARNING,
serverLog(LL_WARNING,
"
Redis
%s
crashed
by
signal:
%d",
REDIS_VERSION,
sig)
;
"Redis
%s
crashed
by
signal:
%d",
REDIS_VERSION,
sig)
;
if
(
sig
==
SIGSEGV
)
{
if
(
eip
!=
NULL
)
{
serverLog(LL_WARNING,
serverLog(LL_WARNING,
"
SIGSEGV
caused
by
address:
%p",
(void*)info->si_addr)
;
"Crashed
running
the
instuction
at:
%p",
eip)
;
}
if
(sig
==
SIGSEGV
||
sig
==
SIGBUS)
{
serverLog(LL_WARNING,
"Accessing
address:
%p",
(void*)info->si_addr)
;
}
}
serverLog(LL_WARNING,
serverLog(LL_WARNING,
"
Failed
assertion:
%s
(%s:%d)",
server.assert_failed,
"Failed
assertion:
%s
(%s:%d)",
server.assert_failed,
server.assert_file,
server.assert_line)
;
server.assert_file,
server.assert_line)
;
/* Log the stack trace */
/* Log the stack trace */
serverLog(LL_WARNING
,
"
---
STACK
TRACE")
;
serverLog
Raw
(LL_WARNING
|LL_RAW,
"\n---
---
STACK
TRACE
------\n
")
;
logStackTrace(uc)
;
logStackTrace(uc)
;
/* Log INFO and CLIENT LIST */
/* Log INFO and CLIENT LIST */
serverLog(LL_WARNING
,
"
---
INFO
OUTPUT")
;
serverLog
Raw
(LL_WARNING
|LL_RAW,
"\n---
---
INFO
OUTPUT
------\n
")
;
infostring
=
genRedisInfoString("all")
;
infostring
=
genRedisInfoString("all")
;
infostring
=
sdscatprintf(infostring,
"hash_init_value:
%u\n",
infostring
=
sdscatprintf(infostring,
"hash_init_value:
%u\n",
dictGetHashFunctionSeed())
;
dictGetHashFunctionSeed())
;
serverLogRaw(LL_WARNING,
infostring)
;
serverLogRaw(LL_WARNING
|LL_RAW
,
infostring)
;
serverLog(LL_WARNING
,
"
---
CLIENT
LIST
OUTPUT")
;
serverLog
Raw
(LL_WARNING
|LL_RAW,
"\n---
---
CLIENT
LIST
OUTPUT
------\n
")
;
clients
=
getAllClientsInfoString()
;
clients
=
getAllClientsInfoString()
;
serverLogRaw(LL_WARNING,
clients)
;
serverLogRaw(LL_WARNING
|LL_RAW
,
clients)
;
sdsfree(infostring)
;
sdsfree(infostring)
;
sdsfree(clients)
;
sdsfree(clients)
;
...
@@ -946,7 +957,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
...
@@ -946,7 +957,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
#if defined(HAVE_PROC_MAPS)
#if defined(HAVE_PROC_MAPS)
/* Test memory */
/* Test memory */
serverLog(LL_WARNING
,
"
---
FAST
MEMORY
TEST")
;
serverLog
Raw
(LL_WARNING
|LL_RAW,
"\n---
---
FAST
MEMORY
TEST
------\n
")
;
bioKillThreads()
;
bioKillThreads()
;
if
(memtest_test_linux_anonymous_maps())
{
if
(memtest_test_linux_anonymous_maps())
{
serverLog(LL_WARNING,
serverLog(LL_WARNING,
...
@@ -957,7 +968,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
...
@@ -957,7 +968,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
}
}
#endif
#endif
serverLog(LL_WARNING,
serverLog
Raw
(LL_WARNING
|LL_RAW
,
"\n===
REDIS
BUG
REPORT
END.
Make
sure
to
include
from
START
to
END.
===\n\n"
"\n===
REDIS
BUG
REPORT
END.
Make
sure
to
include
from
START
to
END.
===\n\n"
"
Please
report
the
crash
by
opening
an
issue
on
github:\n\n"
"
Please
report
the
crash
by
opening
an
issue
on
github:\n\n"
"
http:
//github.com/antirez/redis/issues\n\n"
"
http:
//github.com/antirez/redis/issues\n\n"
...
...
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