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
Show whitespace changes
Inline
Side-by-side
src/debug.c
View file @
f034a075
...
...
@@ -577,8 +577,8 @@ void _serverPanic(char *msg, char *file, int line) {
void
bugReportStart
(
void
)
{
if
(
server
.
bug_report_start
==
0
)
{
serverLog
(
LL_WARNING
,
"
\n\n
=== REDIS BUG REPORT START: Cut & paste starting from here ==="
);
serverLog
Raw
(
LL_WARNING
|
LL_RAW
,
"
\n\n
=== REDIS BUG REPORT START: Cut & paste starting from here ===
\n
"
);
server
.
bug_report_start
=
1
;
}
}
...
...
@@ -629,7 +629,7 @@ void logStackContent(void **sp) {
}
void
logRegisters
(
ucontext_t
*
uc
)
{
serverLog
(
LL_WARNING
,
"
--- REGISTERS"
);
serverLog
(
LL_WARNING
|
LL_RAW
,
"
\n
--
---
-
REGISTERS
------
\n
"
);
/* OSX */
#if defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
...
...
@@ -760,7 +760,7 @@ void logRegisters(ucontext_t *uc) {
/* Logs the stack trace using the backtrace() call. This function is designed
* to be called from signal handlers safely. */
void
logStackTrace
(
ucontext_t
*
uc
)
{
void
*
trace
[
10
0
];
void
*
trace
[
10
1
];
int
trace_size
=
0
,
fd
;
int
log_to_stdout
=
server
.
logfile
[
0
]
==
'\0'
;
...
...
@@ -771,14 +771,19 @@ void logStackTrace(ucontext_t *uc) {
if
(
fd
==
-
1
)
return
;
/* Generate the stack trace */
trace_size
=
backtrace
(
trace
,
100
);
/* overwrite sigaction with caller's address */
if
(
getMcontextEip
(
uc
)
!=
NULL
)
trace
[
1
]
=
getMcontextEip
(
uc
);
trace_size
=
backtrace
(
trace
+
1
,
100
);
if
(
getMcontextEip
(
uc
)
!=
NULL
)
{
char
*
msg1
=
"EIP:
\n
"
;
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 */
backtrace_symbols_fd
(
trace
,
trace_size
,
fd
);
backtrace_symbols_fd
(
trace
+
1
,
trace_size
,
fd
);
/* Cleanup */
if
(
!
log_to_stdout
)
close
(
fd
);
...
...
@@ -794,15 +799,16 @@ void logCurrentClient(void) {
sds
client
;
int
j
;
serverLog
(
LL_WARNING
,
"
--- CURRENT CLIENT INFO"
);
serverLog
Raw
(
LL_WARNING
|
LL_RAW
,
"
\n
---
--- CURRENT CLIENT INFO
------
\n
"
);
client
=
catClientInfoString
(
sdsempty
(),
cc
);
serverLog
(
LL_WARNING
,
"client: %s
"
,
client
);
serverLog
(
LL_WARNING
|
LL_RAW
,
"%s
\n
"
,
client
);
sdsfree
(
client
);
for
(
j
=
0
;
j
<
cc
->
argc
;
j
++
)
{
robj
*
decoded
;
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
);
}
/* Check if the first argument, usually a key, is found inside the
...
...
@@ -907,34 +913,39 @@ int memtest_test_linux_anonymous_maps(void) {
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
ucontext_t
*
uc
=
(
ucontext_t
*
)
secret
;
void
*
eip
=
getMcontextEip
(
uc
);
sds
infostring
,
clients
;
struct
sigaction
act
;
UNUSED
(
info
);
bugReportStart
();
serverLog
(
LL_WARNING
,
"
Redis %s crashed by signal: %d"
,
REDIS_VERSION
,
sig
);
if
(
sig
==
SIGSEGV
)
{
"Redis %s crashed by signal: %d"
,
REDIS_VERSION
,
sig
);
if
(
eip
!=
NULL
)
{
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
,
" Failed assertion: %s (%s:%d)"
,
server
.
assert_failed
,
"Accessing address: %p"
,
(
void
*
)
info
->
si_addr
);
}
serverLog
(
LL_WARNING
,
"Failed assertion: %s (%s:%d)"
,
server
.
assert_failed
,
server
.
assert_file
,
server
.
assert_line
);
/* Log the stack trace */
serverLog
(
LL_WARNING
,
"
--- STACK TRACE"
);
serverLog
Raw
(
LL_WARNING
|
LL_RAW
,
"
\n
---
--- STACK TRACE
------
\n
"
);
logStackTrace
(
uc
);
/* Log INFO and CLIENT LIST */
serverLog
(
LL_WARNING
,
"
--- INFO OUTPUT"
);
serverLog
Raw
(
LL_WARNING
|
LL_RAW
,
"
\n
---
--- INFO OUTPUT
------
\n
"
);
infostring
=
genRedisInfoString
(
"all"
);
infostring
=
sdscatprintf
(
infostring
,
"hash_init_value: %u
\n
"
,
dictGetHashFunctionSeed
());
serverLogRaw
(
LL_WARNING
,
infostring
);
serverLog
(
LL_WARNING
,
"
--- CLIENT LIST OUTPUT"
);
serverLogRaw
(
LL_WARNING
|
LL_RAW
,
infostring
);
serverLog
Raw
(
LL_WARNING
|
LL_RAW
,
"
\n
---
--- CLIENT LIST OUTPUT
------
\n
"
);
clients
=
getAllClientsInfoString
();
serverLogRaw
(
LL_WARNING
,
clients
);
serverLogRaw
(
LL_WARNING
|
LL_RAW
,
clients
);
sdsfree
(
infostring
);
sdsfree
(
clients
);
...
...
@@ -946,7 +957,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
#if defined(HAVE_PROC_MAPS)
/* Test memory */
serverLog
(
LL_WARNING
,
"
--- FAST MEMORY TEST"
);
serverLog
Raw
(
LL_WARNING
|
LL_RAW
,
"
\n
---
--- FAST MEMORY TEST
------
\n
"
);
bioKillThreads
();
if
(
memtest_test_linux_anonymous_maps
())
{
serverLog
(
LL_WARNING
,
...
...
@@ -957,7 +968,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
}
#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
"
" Please report the crash by opening an issue on github:
\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