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
890da62e
Commit
890da62e
authored
Jan 23, 2012
by
antirez
Browse files
Merge branch 'unstable' into limits
parents
498dc555
b362c111
Changes
5
Hide whitespace changes
Inline
Side-by-side
src/debug.c
View file @
890da62e
...
@@ -2,6 +2,12 @@
...
@@ -2,6 +2,12 @@
#include "sha1.h"
/* SHA1 is used for DEBUG DIGEST */
#include "sha1.h"
/* SHA1 is used for DEBUG DIGEST */
#include <arpa/inet.h>
#include <arpa/inet.h>
#include <signal.h>
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
#include <ucontext.h>
#endif
/* HAVE_BACKTRACE */
/* ================================= Debugging ============================== */
/* ================================= Debugging ============================== */
...
@@ -297,6 +303,8 @@ void debugCommand(redisClient *c) {
...
@@ -297,6 +303,8 @@ void debugCommand(redisClient *c) {
}
}
}
}
/* =========================== Crash handling ============================== */
void
_redisAssert
(
char
*
estr
,
char
*
file
,
int
line
)
{
void
_redisAssert
(
char
*
estr
,
char
*
file
,
int
line
)
{
bugReportStart
();
bugReportStart
();
redisLog
(
REDIS_WARNING
,
"=== ASSERTION FAILED ==="
);
redisLog
(
REDIS_WARNING
,
"=== ASSERTION FAILED ==="
);
...
@@ -380,3 +388,268 @@ void _redisPanic(char *msg, char *file, int line) {
...
@@ -380,3 +388,268 @@ void _redisPanic(char *msg, char *file, int line) {
*
((
char
*
)
-
1
)
=
'x'
;
*
((
char
*
)
-
1
)
=
'x'
;
#endif
#endif
}
}
#ifdef HAVE_BACKTRACE
static
void
*
getMcontextEip
(
ucontext_t
*
uc
)
{
#if defined(__FreeBSD__)
return
(
void
*
)
uc
->
uc_mcontext
.
mc_eip
;
#elif defined(__dietlibc__)
return
(
void
*
)
uc
->
uc_mcontext
.
eip
;
#elif defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)
#if __x86_64__
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__rip
;
#elif __i386__
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__eip
;
#else
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__srr0
;
#endif
#elif defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__)
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__rip
;
#else
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__eip
;
#endif
#elif defined(__i386__)
return
(
void
*
)
uc
->
uc_mcontext
.
gregs
[
14
];
/* Linux 32 */
#elif defined(__X86_64__) || defined(__x86_64__)
return
(
void
*
)
uc
->
uc_mcontext
.
gregs
[
16
];
/* Linux 64 */
#elif defined(__ia64__)
/* Linux IA64 */
return
(
void
*
)
uc
->
uc_mcontext
.
sc_ip
;
#else
return
NULL
;
#endif
}
void
bugReportStart
(
void
)
{
if
(
server
.
bug_report_start
==
0
)
{
redisLog
(
REDIS_WARNING
,
"
\n\n
=== REDIS BUG REPORT START: Cut & paste starting from here ==="
);
server
.
bug_report_start
=
1
;
}
}
void
logStackContent
(
void
**
sp
)
{
int
i
;
for
(
i
=
15
;
i
>=
0
;
i
--
)
{
if
(
sizeof
(
long
)
==
4
)
redisLog
(
REDIS_WARNING
,
"(%08lx) -> %08lx"
,
sp
+
i
,
sp
[
i
]);
else
redisLog
(
REDIS_WARNING
,
"(%016lx) -> %016lx"
,
sp
+
i
,
sp
[
i
]);
}
}
void
logRegisters
(
ucontext_t
*
uc
)
{
redisLog
(
REDIS_WARNING
,
"--- REGISTERS"
);
#if defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__)
redisLog
(
REDIS_WARNING
,
"
\n
"
"RAX:%016lx RBX:%016lx
\n
RCX:%016lx RDX:%016lx
\n
"
"RDI:%016lx RSI:%016lx
\n
RBP:%016lx RSP:%016lx
\n
"
"R8 :%016lx R9 :%016lx
\n
R10:%016lx R11:%016lx
\n
"
"R12:%016lx R13:%016lx
\n
R14:%016lx R15:%016lx
\n
"
"RIP:%016lx EFL:%016lx
\n
CS :%016lx FS:%016lx GS:%016lx"
,
uc
->
uc_mcontext
->
__ss
.
__rax
,
uc
->
uc_mcontext
->
__ss
.
__rbx
,
uc
->
uc_mcontext
->
__ss
.
__rcx
,
uc
->
uc_mcontext
->
__ss
.
__rdx
,
uc
->
uc_mcontext
->
__ss
.
__rdi
,
uc
->
uc_mcontext
->
__ss
.
__rsi
,
uc
->
uc_mcontext
->
__ss
.
__rbp
,
uc
->
uc_mcontext
->
__ss
.
__rsp
,
uc
->
uc_mcontext
->
__ss
.
__r8
,
uc
->
uc_mcontext
->
__ss
.
__r9
,
uc
->
uc_mcontext
->
__ss
.
__r10
,
uc
->
uc_mcontext
->
__ss
.
__r11
,
uc
->
uc_mcontext
->
__ss
.
__r12
,
uc
->
uc_mcontext
->
__ss
.
__r13
,
uc
->
uc_mcontext
->
__ss
.
__r14
,
uc
->
uc_mcontext
->
__ss
.
__r15
,
uc
->
uc_mcontext
->
__ss
.
__rip
,
uc
->
uc_mcontext
->
__ss
.
__rflags
,
uc
->
uc_mcontext
->
__ss
.
__cs
,
uc
->
uc_mcontext
->
__ss
.
__fs
,
uc
->
uc_mcontext
->
__ss
.
__gs
);
logStackContent
((
void
**
)
uc
->
uc_mcontext
->
__ss
.
__rsp
);
#else
redisLog
(
REDIS_WARNING
,
"
\n
"
"EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx
\n
"
"EDI:%08lx ESI:%08lx EBP:%08lx ESP:%08lx
\n
"
"SS:%08lx EFL:%08lx EIP:%08lx CS :%08lx
\n
"
"DS:%08lx ES:%08lx FS :%08lx GS :%08lx"
,
uc
->
uc_mcontext
->
__ss
.
__eax
,
uc
->
uc_mcontext
->
__ss
.
__ebx
,
uc
->
uc_mcontext
->
__ss
.
__ecx
,
uc
->
uc_mcontext
->
__ss
.
__edx
,
uc
->
uc_mcontext
->
__ss
.
__edi
,
uc
->
uc_mcontext
->
__ss
.
__esi
,
uc
->
uc_mcontext
->
__ss
.
__ebp
,
uc
->
uc_mcontext
->
__ss
.
__esp
,
uc
->
uc_mcontext
->
__ss
.
__ss
,
uc
->
uc_mcontext
->
__ss
.
__eflags
,
uc
->
uc_mcontext
->
__ss
.
__eip
,
uc
->
uc_mcontext
->
__ss
.
__cs
,
uc
->
uc_mcontext
->
__ss
.
__ds
,
uc
->
uc_mcontext
->
__ss
.
__es
,
uc
->
uc_mcontext
->
__ss
.
__fs
,
uc
->
uc_mcontext
->
__ss
.
__gs
);
logStackContent
((
void
**
)
uc
->
uc_mcontext
->
__ss
.
__esp
);
#endif
#elif defined(__i386__)
redisLog
(
REDIS_WARNING
,
"
\n
"
"EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx
\n
"
"EDI:%08lx ESI:%08lx EBP:%08lx ESP:%08lx
\n
"
"SS :%08lx EFL:%08lx EIP:%08lx CS:%08lx
\n
"
"DS :%08lx ES :%08lx FS :%08lx GS:%08lx"
,
uc
->
uc_mcontext
.
gregs
[
11
],
uc
->
uc_mcontext
.
gregs
[
8
],
uc
->
uc_mcontext
.
gregs
[
10
],
uc
->
uc_mcontext
.
gregs
[
9
],
uc
->
uc_mcontext
.
gregs
[
4
],
uc
->
uc_mcontext
.
gregs
[
5
],
uc
->
uc_mcontext
.
gregs
[
6
],
uc
->
uc_mcontext
.
gregs
[
7
],
uc
->
uc_mcontext
.
gregs
[
18
],
uc
->
uc_mcontext
.
gregs
[
17
],
uc
->
uc_mcontext
.
gregs
[
14
],
uc
->
uc_mcontext
.
gregs
[
15
],
uc
->
uc_mcontext
.
gregs
[
3
],
uc
->
uc_mcontext
.
gregs
[
2
],
uc
->
uc_mcontext
.
gregs
[
1
],
uc
->
uc_mcontext
.
gregs
[
0
]
);
logStackContent
((
void
**
)
uc
->
uc_mcontext
.
gregs
[
7
]);
#elif defined(__X86_64__) || defined(__x86_64__)
redisLog
(
REDIS_WARNING
,
"
\n
"
"RAX:%016lx RBX:%016lx
\n
RCX:%016lx RDX:%016lx
\n
"
"RDI:%016lx RSI:%016lx
\n
RBP:%016lx RSP:%016lx
\n
"
"R8 :%016lx R9 :%016lx
\n
R10:%016lx R11:%016lx
\n
"
"R12:%016lx R13:%016lx
\n
R14:%016lx R15:%016lx
\n
"
"RIP:%016lx EFL:%016lx
\n
CSGSFS:%016lx"
,
uc
->
uc_mcontext
.
gregs
[
13
],
uc
->
uc_mcontext
.
gregs
[
11
],
uc
->
uc_mcontext
.
gregs
[
14
],
uc
->
uc_mcontext
.
gregs
[
12
],
uc
->
uc_mcontext
.
gregs
[
8
],
uc
->
uc_mcontext
.
gregs
[
9
],
uc
->
uc_mcontext
.
gregs
[
10
],
uc
->
uc_mcontext
.
gregs
[
15
],
uc
->
uc_mcontext
.
gregs
[
0
],
uc
->
uc_mcontext
.
gregs
[
1
],
uc
->
uc_mcontext
.
gregs
[
2
],
uc
->
uc_mcontext
.
gregs
[
3
],
uc
->
uc_mcontext
.
gregs
[
4
],
uc
->
uc_mcontext
.
gregs
[
5
],
uc
->
uc_mcontext
.
gregs
[
6
],
uc
->
uc_mcontext
.
gregs
[
7
],
uc
->
uc_mcontext
.
gregs
[
16
],
uc
->
uc_mcontext
.
gregs
[
17
],
uc
->
uc_mcontext
.
gregs
[
18
]
);
logStackContent
((
void
**
)
uc
->
uc_mcontext
.
gregs
[
15
]);
#else
redisLog
(
REDIS_WARNING
,
" Dumping of registers not supported for this OS/arch"
);
#endif
}
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
void
*
trace
[
100
];
char
**
messages
=
NULL
;
int
i
,
trace_size
=
0
;
ucontext_t
*
uc
=
(
ucontext_t
*
)
secret
;
sds
infostring
,
clients
;
struct
sigaction
act
;
REDIS_NOTUSED
(
info
);
bugReportStart
();
redisLog
(
REDIS_WARNING
,
" Redis %s crashed by signal: %d"
,
REDIS_VERSION
,
sig
);
redisLog
(
REDIS_WARNING
,
" Failed assertion: %s (%s:%d)"
,
server
.
assert_failed
,
server
.
assert_file
,
server
.
assert_line
);
/* Generate the stack trace */
trace_size
=
backtrace
(
trace
,
100
);
/* overwrite sigaction with caller's address */
if
(
getMcontextEip
(
uc
)
!=
NULL
)
{
trace
[
1
]
=
getMcontextEip
(
uc
);
}
messages
=
backtrace_symbols
(
trace
,
trace_size
);
redisLog
(
REDIS_WARNING
,
"--- STACK TRACE"
);
for
(
i
=
1
;
i
<
trace_size
;
++
i
)
redisLog
(
REDIS_WARNING
,
"%s"
,
messages
[
i
]);
/* Log INFO and CLIENT LIST */
redisLog
(
REDIS_WARNING
,
"--- INFO OUTPUT"
);
infostring
=
genRedisInfoString
(
"all"
);
infostring
=
sdscatprintf
(
infostring
,
"hash_init_value: %u
\n
"
,
dictGetHashFunctionSeed
());
redisLogRaw
(
REDIS_WARNING
,
infostring
);
redisLog
(
REDIS_WARNING
,
"--- CLIENT LIST OUTPUT"
);
clients
=
getAllClientsInfoString
();
redisLogRaw
(
REDIS_WARNING
,
clients
);
/* Don't sdsfree() strings to avoid a crash. Memory may be corrupted. */
/* Log CURRENT CLIENT info */
if
(
server
.
current_client
)
{
redisClient
*
cc
=
server
.
current_client
;
sds
client
;
int
j
;
redisLog
(
REDIS_WARNING
,
"--- CURRENT CLIENT INFO"
);
client
=
getClientInfoString
(
cc
);
redisLog
(
REDIS_WARNING
,
"client: %s"
,
client
);
/* Missing sdsfree(client) to avoid crash if memory is corrupted. */
for
(
j
=
0
;
j
<
cc
->
argc
;
j
++
)
{
robj
*
decoded
;
decoded
=
getDecodedObject
(
cc
->
argv
[
j
]);
redisLog
(
REDIS_WARNING
,
"argv[%d]: '%s'"
,
j
,
(
char
*
)
decoded
->
ptr
);
decrRefCount
(
decoded
);
}
/* Check if the first argument, usually a key, is found inside the
* selected DB, and if so print info about the associated object. */
if
(
cc
->
argc
>=
1
)
{
robj
*
val
,
*
key
;
dictEntry
*
de
;
key
=
getDecodedObject
(
cc
->
argv
[
1
]);
de
=
dictFind
(
cc
->
db
->
dict
,
key
->
ptr
);
if
(
de
)
{
val
=
dictGetVal
(
de
);
redisLog
(
REDIS_WARNING
,
"key '%s' found in DB containing the following object:"
,
key
->
ptr
);
redisLogObjectDebugInfo
(
val
);
}
decrRefCount
(
key
);
}
}
/* Log dump of processor registers */
logRegisters
(
uc
);
redisLog
(
REDIS_WARNING
,
"
\n
=== 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. */
if
(
server
.
daemonize
)
unlink
(
server
.
pidfile
);
/* Make sure we exit with the right signal at the end. So for instance
* the core will be dumped if enabled. */
sigemptyset
(
&
act
.
sa_mask
);
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction
* is used. Otherwise, sa_handler is used */
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
;
act
.
sa_handler
=
SIG_DFL
;
sigaction
(
sig
,
&
act
,
NULL
);
kill
(
getpid
(),
sig
);
}
#endif
/* HAVE_BACKTRACE */
src/dict.c
View file @
890da62e
...
@@ -85,10 +85,20 @@ unsigned int dictIdentityHashFunction(unsigned int key)
...
@@ -85,10 +85,20 @@ unsigned int dictIdentityHashFunction(unsigned int key)
return
key
;
return
key
;
}
}
static
int
dict_hash_function_seed
=
5381
;
void
dictSetHashFunctionSeed
(
unsigned
int
seed
)
{
dict_hash_function_seed
=
seed
;
}
unsigned
int
dictGetHashFunctionSeed
(
void
)
{
return
dict_hash_function_seed
;
}
/* Generic hash function (a popular one from Bernstein).
/* Generic hash function (a popular one from Bernstein).
* I tested a few and this was the best. */
* I tested a few and this was the best. */
unsigned
int
dictGenHashFunction
(
const
unsigned
char
*
buf
,
int
len
)
{
unsigned
int
dictGenHashFunction
(
const
unsigned
char
*
buf
,
int
len
)
{
unsigned
int
hash
=
5381
;
unsigned
int
hash
=
dict_hash_function_seed
;
while
(
len
--
)
while
(
len
--
)
hash
=
((
hash
<<
5
)
+
hash
)
+
(
*
buf
++
);
/* hash * 33 + c */
hash
=
((
hash
<<
5
)
+
hash
)
+
(
*
buf
++
);
/* hash * 33 + c */
...
@@ -97,7 +107,7 @@ unsigned int dictGenHashFunction(const unsigned char *buf, int len) {
...
@@ -97,7 +107,7 @@ unsigned int dictGenHashFunction(const unsigned char *buf, int len) {
/* And a case insensitive version */
/* And a case insensitive version */
unsigned
int
dictGenCaseHashFunction
(
const
unsigned
char
*
buf
,
int
len
)
{
unsigned
int
dictGenCaseHashFunction
(
const
unsigned
char
*
buf
,
int
len
)
{
unsigned
int
hash
=
5381
;
unsigned
int
hash
=
dict_hash_function_seed
;
while
(
len
--
)
while
(
len
--
)
hash
=
((
hash
<<
5
)
+
hash
)
+
(
tolower
(
*
buf
++
));
/* hash * 33 + c */
hash
=
((
hash
<<
5
)
+
hash
)
+
(
tolower
(
*
buf
++
));
/* hash * 33 + c */
...
...
src/dict.h
View file @
890da62e
...
@@ -162,6 +162,8 @@ void dictEnableResize(void);
...
@@ -162,6 +162,8 @@ void dictEnableResize(void);
void
dictDisableResize
(
void
);
void
dictDisableResize
(
void
);
int
dictRehash
(
dict
*
d
,
int
n
);
int
dictRehash
(
dict
*
d
,
int
n
);
int
dictRehashMilliseconds
(
dict
*
d
,
int
ms
);
int
dictRehashMilliseconds
(
dict
*
d
,
int
ms
);
void
dictSetHashFunctionSeed
(
unsigned
int
initval
);
unsigned
int
dictGetHashFunctionSeed
(
void
);
/* Hash table types */
/* Hash table types */
extern
dictType
dictTypeHeapStringCopyKey
;
extern
dictType
dictTypeHeapStringCopyKey
;
...
...
src/redis.c
View file @
890da62e
...
@@ -31,11 +31,6 @@
...
@@ -31,11 +31,6 @@
#include "slowlog.h"
#include "slowlog.h"
#include "bio.h"
#include "bio.h"
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
#include <ucontext.h>
#endif
/* HAVE_BACKTRACE */
#include <time.h>
#include <time.h>
#include <signal.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/wait.h>
...
@@ -1085,8 +1080,6 @@ void initServer() {
...
@@ -1085,8 +1080,6 @@ void initServer() {
scriptingInit
();
scriptingInit
();
slowlogInit
();
slowlogInit
();
bioInit
();
bioInit
();
srand
(
time
(
NULL
)
^
getpid
());
}
}
/* Populates the Redis Command Table starting from the hard coded list
/* Populates the Redis Command Table starting from the hard coded list
...
@@ -1933,136 +1926,6 @@ void redisAsciiArt(void) {
...
@@ -1933,136 +1926,6 @@ void redisAsciiArt(void) {
zfree
(
buf
);
zfree
(
buf
);
}
}
#ifdef HAVE_BACKTRACE
static
void
*
getMcontextEip
(
ucontext_t
*
uc
)
{
#if defined(__FreeBSD__)
return
(
void
*
)
uc
->
uc_mcontext
.
mc_eip
;
#elif defined(__dietlibc__)
return
(
void
*
)
uc
->
uc_mcontext
.
eip
;
#elif defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)
#if __x86_64__
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__rip
;
#elif __i386__
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__eip
;
#else
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__srr0
;
#endif
#elif defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__)
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__rip
;
#else
return
(
void
*
)
uc
->
uc_mcontext
->
__ss
.
__eip
;
#endif
#elif defined(__i386__)
return
(
void
*
)
uc
->
uc_mcontext
.
gregs
[
14
];
/* Linux 32 */
#elif defined(__X86_64__) || defined(__x86_64__)
return
(
void
*
)
uc
->
uc_mcontext
.
gregs
[
16
];
/* Linux 64 */
#elif defined(__ia64__)
/* Linux IA64 */
return
(
void
*
)
uc
->
uc_mcontext
.
sc_ip
;
#else
return
NULL
;
#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
)
{
void
*
trace
[
100
];
char
**
messages
=
NULL
;
int
i
,
trace_size
=
0
;
ucontext_t
*
uc
=
(
ucontext_t
*
)
secret
;
sds
infostring
,
clients
;
struct
sigaction
act
;
REDIS_NOTUSED
(
info
);
bugReportStart
();
redisLog
(
REDIS_WARNING
,
" Redis %s crashed by signal: %d"
,
REDIS_VERSION
,
sig
);
redisLog
(
REDIS_WARNING
,
" Failed assertion: %s (%s:%d)"
,
server
.
assert_failed
,
server
.
assert_file
,
server
.
assert_line
);
/* Generate the stack trace */
trace_size
=
backtrace
(
trace
,
100
);
/* overwrite sigaction with caller's address */
if
(
getMcontextEip
(
uc
)
!=
NULL
)
{
trace
[
1
]
=
getMcontextEip
(
uc
);
}
messages
=
backtrace_symbols
(
trace
,
trace_size
);
redisLog
(
REDIS_WARNING
,
"--- STACK TRACE"
);
for
(
i
=
1
;
i
<
trace_size
;
++
i
)
redisLog
(
REDIS_WARNING
,
"%s"
,
messages
[
i
]);
/* Log INFO and CLIENT LIST */
redisLog
(
REDIS_WARNING
,
"--- INFO OUTPUT"
);
infostring
=
genRedisInfoString
(
"all"
);
redisLogRaw
(
REDIS_WARNING
,
infostring
);
redisLog
(
REDIS_WARNING
,
"--- CLIENT LIST OUTPUT"
);
clients
=
getAllClientsInfoString
();
redisLogRaw
(
REDIS_WARNING
,
clients
);
/* Don't sdsfree() strings to avoid a crash. Memory may be corrupted. */
/* Log CURRENT CLIENT info */
if
(
server
.
current_client
)
{
redisClient
*
cc
=
server
.
current_client
;
sds
client
;
int
j
;
redisLog
(
REDIS_WARNING
,
"--- CURRENT CLIENT INFO"
);
client
=
getClientInfoString
(
cc
);
redisLog
(
REDIS_WARNING
,
"client: %s"
,
client
);
/* Missing sdsfree(client) to avoid crash if memory is corrupted. */
for
(
j
=
0
;
j
<
cc
->
argc
;
j
++
)
{
robj
*
decoded
;
decoded
=
getDecodedObject
(
cc
->
argv
[
j
]);
redisLog
(
REDIS_WARNING
,
"argv[%d]: '%s'"
,
j
,
(
char
*
)
decoded
->
ptr
);
decrRefCount
(
decoded
);
}
/* Check if the first argument, usually a key, is found inside the
* selected DB, and if so print info about the associated object. */
if
(
cc
->
argc
>=
1
)
{
robj
*
val
,
*
key
;
dictEntry
*
de
;
key
=
getDecodedObject
(
cc
->
argv
[
1
]);
de
=
dictFind
(
cc
->
db
->
dict
,
key
->
ptr
);
if
(
de
)
{
val
=
dictGetVal
(
de
);
redisLog
(
REDIS_WARNING
,
"key '%s' found in DB containing the following object:"
,
key
->
ptr
);
redisLogObjectDebugInfo
(
val
);
}
decrRefCount
(
key
);
}
}
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. */
if
(
server
.
daemonize
)
unlink
(
server
.
pidfile
);
/* Make sure we exit with the right signal at the end. So for instance
* the core will be dumped if enabled. */
sigemptyset
(
&
act
.
sa_mask
);
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction
* is used. Otherwise, sa_handler is used */
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
;
act
.
sa_handler
=
SIG_DFL
;
sigaction
(
sig
,
&
act
,
NULL
);
kill
(
getpid
(),
sig
);
}
#endif
/* HAVE_BACKTRACE */
static
void
sigtermHandler
(
int
sig
)
{
static
void
sigtermHandler
(
int
sig
)
{
REDIS_NOTUSED
(
sig
);
REDIS_NOTUSED
(
sig
);
...
@@ -2094,9 +1957,15 @@ void setupSignalHandlers(void) {
...
@@ -2094,9 +1957,15 @@ void setupSignalHandlers(void) {
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
long
long
start
;
long
long
start
;
struct
timeval
tv
;
/* We need to initialize our libraries, and the server configuration. */
zmalloc_enable_thread_safeness
();
zmalloc_enable_thread_safeness
();
srand
(
time
(
NULL
)
^
getpid
());
gettimeofday
(
&
tv
,
NULL
);
dictSetHashFunctionSeed
(
tv
.
tv_sec
^
tv
.
tv_usec
^
getpid
());
initServerConfig
();
initServerConfig
();
if
(
argc
>=
2
)
{
if
(
argc
>=
2
)
{
int
j
=
1
;
/* First option to parse in argv[] */
int
j
=
1
;
/* First option to parse in argv[] */
sds
options
=
sdsempty
();
sds
options
=
sdsempty
();
...
...
src/redis.h
View file @
890da62e
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#include <syslog.h>
#include <syslog.h>
#include <netinet/in.h>
#include <netinet/in.h>
#include <lua.h>
#include <lua.h>
#include <signal.h>
#include "ae.h"
/* Event driven programming library */
#include "ae.h"
/* Event driven programming library */
#include "sds.h"
/* Dynamic safe strings */
#include "sds.h"
/* Dynamic safe strings */
...
@@ -1169,5 +1170,6 @@ void _redisAssert(char *estr, char *file, int line);
...
@@ -1169,5 +1170,6 @@ 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
);
void
bugReportStart
(
void
);
void
redisLogObjectDebugInfo
(
robj
*
o
);
void
redisLogObjectDebugInfo
(
robj
*
o
);
void
sigsegvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
);
sds
genRedisInfoString
(
char
*
section
);
#endif
#endif
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