提交 38b60dea 编写于 作者: A antirez

Fix and refactoring of code used to get registers on crash.

This fixes compilation on FreeBSD (and possibly other systems) by
not using ucontext_t at all if HAVE_BACKTRACE is not defined.
Also the ifdefs to get the registers are modified to explicitly test for the
operating system in the first level, and the arch in the second level
of nesting.
上级 69b30cfc
...@@ -398,30 +398,31 @@ void bugReportStart(void) { ...@@ -398,30 +398,31 @@ void bugReportStart(void) {
#ifdef HAVE_BACKTRACE #ifdef HAVE_BACKTRACE
static void *getMcontextEip(ucontext_t *uc) { static void *getMcontextEip(ucontext_t *uc) {
#if defined(__FreeBSD__) #if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)
return (void*) uc->uc_mcontext.mc_eip; /* OSX < 10.6 */
#elif defined(__dietlibc__) #if defined(__x86_64__)
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; return (void*) uc->uc_mcontext->__ss.__rip;
#elif __i386__ #elif defined(__i386__)
return (void*) uc->uc_mcontext->__ss.__eip; return (void*) uc->uc_mcontext->__ss.__eip;
#else #else
return (void*) uc->uc_mcontext->__ss.__srr0; return (void*) uc->uc_mcontext->__ss.__srr0;
#endif #endif
#elif defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6) #elif defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__) /* OSX >= 10.6 */
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__)
return (void*) uc->uc_mcontext->__ss.__rip; return (void*) uc->uc_mcontext->__ss.__rip;
#else #else
return (void*) uc->uc_mcontext->__ss.__eip; return (void*) uc->uc_mcontext->__ss.__eip;
#endif #endif
#elif defined(__i386__) #elif defined(__linux__)
/* Linux */
#if defined(__i386__)
return (void*) uc->uc_mcontext.gregs[14]; /* Linux 32 */ return (void*) uc->uc_mcontext.gregs[14]; /* Linux 32 */
#elif defined(__X86_64__) || defined(__x86_64__) #elif defined(__X86_64__) || defined(__x86_64__)
return (void*) uc->uc_mcontext.gregs[16]; /* Linux 64 */ return (void*) uc->uc_mcontext.gregs[16]; /* Linux 64 */
#elif defined(__ia64__) /* Linux IA64 */ #elif defined(__ia64__) /* Linux IA64 */
return (void*) uc->uc_mcontext.sc_ip; return (void*) uc->uc_mcontext.sc_ip;
#endif
#else #else
return NULL; return NULL;
#endif #endif
...@@ -439,8 +440,11 @@ void logStackContent(void **sp) { ...@@ -439,8 +440,11 @@ void logStackContent(void **sp) {
void logRegisters(ucontext_t *uc) { void logRegisters(ucontext_t *uc) {
redisLog(REDIS_WARNING, "--- REGISTERS"); redisLog(REDIS_WARNING, "--- REGISTERS");
/* OSX */
#if defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6) #if defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6)
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__) /* OSX AMD64 */
#if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__)
redisLog(REDIS_WARNING, redisLog(REDIS_WARNING,
"\n" "\n"
"RAX:%016lx RBX:%016lx\nRCX:%016lx RDX:%016lx\n" "RAX:%016lx RBX:%016lx\nRCX:%016lx RDX:%016lx\n"
...@@ -471,7 +475,8 @@ void logRegisters(ucontext_t *uc) { ...@@ -471,7 +475,8 @@ void logRegisters(ucontext_t *uc) {
uc->uc_mcontext->__ss.__gs uc->uc_mcontext->__ss.__gs
); );
logStackContent((void**)uc->uc_mcontext->__ss.__rsp); logStackContent((void**)uc->uc_mcontext->__ss.__rsp);
#else #else
/* OSX x86 */
redisLog(REDIS_WARNING, redisLog(REDIS_WARNING,
"\n" "\n"
"EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n" "EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n"
...@@ -496,8 +501,11 @@ void logRegisters(ucontext_t *uc) { ...@@ -496,8 +501,11 @@ void logRegisters(ucontext_t *uc) {
uc->uc_mcontext->__ss.__gs uc->uc_mcontext->__ss.__gs
); );
logStackContent((void**)uc->uc_mcontext->__ss.__esp); logStackContent((void**)uc->uc_mcontext->__ss.__esp);
#endif #endif
#elif defined(__i386__) /* Linux */
#elif defined(__linux__)
/* Linux x86 */
#if defined(__i386__)
redisLog(REDIS_WARNING, redisLog(REDIS_WARNING,
"\n" "\n"
"EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n" "EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n"
...@@ -522,7 +530,8 @@ void logRegisters(ucontext_t *uc) { ...@@ -522,7 +530,8 @@ void logRegisters(ucontext_t *uc) {
uc->uc_mcontext.gregs[0] uc->uc_mcontext.gregs[0]
); );
logStackContent((void**)uc->uc_mcontext.gregs[7]); logStackContent((void**)uc->uc_mcontext.gregs[7]);
#elif defined(__X86_64__) || defined(__x86_64__) #elif defined(__X86_64__) || defined(__x86_64__)
/* Linux AMD64 */
redisLog(REDIS_WARNING, redisLog(REDIS_WARNING,
"\n" "\n"
"RAX:%016lx RBX:%016lx\nRCX:%016lx RDX:%016lx\n" "RAX:%016lx RBX:%016lx\nRCX:%016lx RDX:%016lx\n"
...@@ -551,6 +560,7 @@ void logRegisters(ucontext_t *uc) { ...@@ -551,6 +560,7 @@ void logRegisters(ucontext_t *uc) {
uc->uc_mcontext.gregs[18] uc->uc_mcontext.gregs[18]
); );
logStackContent((void**)uc->uc_mcontext.gregs[15]); logStackContent((void**)uc->uc_mcontext.gregs[15]);
#endif
#else #else
redisLog(REDIS_WARNING, redisLog(REDIS_WARNING,
" Dumping of registers not supported for this OS/arch"); " Dumping of registers not supported for this OS/arch");
...@@ -677,7 +687,9 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) { ...@@ -677,7 +687,9 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
#include <sys/time.h> #include <sys/time.h>
void watchdogSignalHandler(int sig, siginfo_t *info, void *secret) { void watchdogSignalHandler(int sig, siginfo_t *info, void *secret) {
#ifdef HAVE_BACKTRACE
ucontext_t *uc = (ucontext_t*) secret; ucontext_t *uc = (ucontext_t*) secret;
#endif
REDIS_NOTUSED(info); REDIS_NOTUSED(info);
REDIS_NOTUSED(sig); REDIS_NOTUSED(sig);
sds st, log; sds st, log;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册