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
=
"
\n
Backtrace:
\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