summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Carlier <devnexen@gmail.com>2018-11-24 15:49:45 +0000
committerDavid Carlier <devnexen@gmail.com>2018-11-25 07:21:56 +0000
commit69ca9078684f66366c461092bdb46172c27b845d (patch)
tree3a8fab1d428bb3a3fddab4d86e79096513f9011f /src
parent0c12ebf6e79b3665e0dfa313f27492446b477758 (diff)
downloadredis-69ca9078684f66366c461092bdb46172c27b845d.tar.gz
Backtrace/register dump on BSD.
FreeBSD/DragonFlyBSD does have backtrace only it does not belong to libc.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile4
-rw-r--r--src/config.h3
-rw-r--r--src/debug.c93
3 files changed, 97 insertions, 3 deletions
diff --git a/src/Makefile b/src/Makefile
index 0de0a1c61..188dac3b9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -105,11 +105,11 @@ ifeq ($(uname_S),OpenBSD)
else
ifeq ($(uname_S),FreeBSD)
# FreeBSD
- FINAL_LIBS+= -lpthread
+ FINAL_LIBS+= -lpthread -lexecinfo
else
ifeq ($(uname_S),DragonFly)
# FreeBSD
- FINAL_LIBS+= -lpthread
+ FINAL_LIBS+= -lpthread -lexecinfo
else
# All the other OSes (notably Linux)
FINAL_LDFLAGS+= -rdynamic
diff --git a/src/config.h b/src/config.h
index ee3ad508e..0a74a7609 100644
--- a/src/config.h
+++ b/src/config.h
@@ -62,7 +62,8 @@
#endif
/* Test for backtrace() */
-#if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__))
+#if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__)) || \
+ defined(__FreeBSD__) || defined(__DragonFly__)
#define HAVE_BACKTRACE 1
#endif
diff --git a/src/debug.c b/src/debug.c
index 70def3b30..ff0df7568 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -729,6 +729,15 @@ static void *getMcontextEip(ucontext_t *uc) {
#elif defined(__aarch64__) /* Linux AArch64 */
return (void*) uc->uc_mcontext.pc;
#endif
+#elif defined(__FreeBSD__)
+ /* FreeBSD */
+ #if defined(__i386__)
+ return (void*) uc->uc_mcontext.mc_eip;
+ #elif defined(__x86_64__)
+ return (void*) uc->uc_mcontext.mc_rip;
+ #endif
+#elif defined(__DragonFly__)
+ return (void*) uc->uc_mcontext.mc_rip;
#else
return NULL;
#endif
@@ -870,6 +879,90 @@ void logRegisters(ucontext_t *uc) {
);
logStackContent((void**)uc->uc_mcontext.gregs[15]);
#endif
+#elif defined(__FreeBSD__)
+ #if defined(__x86_64__)
+ serverLog(LL_WARNING,
+ "\n"
+ "RAX:%016lx RBX:%016lx\nRCX:%016lx RDX:%016lx\n"
+ "RDI:%016lx RSI:%016lx\nRBP:%016lx RSP:%016lx\n"
+ "R8 :%016lx R9 :%016lx\nR10:%016lx R11:%016lx\n"
+ "R12:%016lx R13:%016lx\nR14:%016lx R15:%016lx\n"
+ "RIP:%016lx EFL:%016lx\nCSGSFS:%016lx",
+ (unsigned long) uc->uc_mcontext.mc_rax,
+ (unsigned long) uc->uc_mcontext.mc_rbx,
+ (unsigned long) uc->uc_mcontext.mc_rcx,
+ (unsigned long) uc->uc_mcontext.mc_rdx,
+ (unsigned long) uc->uc_mcontext.mc_rdi,
+ (unsigned long) uc->uc_mcontext.mc_rsi,
+ (unsigned long) uc->uc_mcontext.mc_rbp,
+ (unsigned long) uc->uc_mcontext.mc_rsp,
+ (unsigned long) uc->uc_mcontext.mc_r8,
+ (unsigned long) uc->uc_mcontext.mc_r9,
+ (unsigned long) uc->uc_mcontext.mc_r10,
+ (unsigned long) uc->uc_mcontext.mc_r11,
+ (unsigned long) uc->uc_mcontext.mc_r12,
+ (unsigned long) uc->uc_mcontext.mc_r13,
+ (unsigned long) uc->uc_mcontext.mc_r14,
+ (unsigned long) uc->uc_mcontext.mc_r15,
+ (unsigned long) uc->uc_mcontext.mc_rip,
+ (unsigned long) uc->uc_mcontext.mc_rflags,
+ (unsigned long) uc->uc_mcontext.mc_cs
+ );
+ logStackContent((void**)uc->uc_mcontext.mc_rsp);
+ #elif defined(__i386__)
+ serverLog(LL_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",
+ (unsigned long) uc->uc_mcontext.mc_eax,
+ (unsigned long) uc->uc_mcontext.mc_ebx,
+ (unsigned long) uc->uc_mcontext.mc_ebx,
+ (unsigned long) uc->uc_mcontext.mc_edx,
+ (unsigned long) uc->uc_mcontext.mc_edi,
+ (unsigned long) uc->uc_mcontext.mc_esi,
+ (unsigned long) uc->uc_mcontext.mc_ebp,
+ (unsigned long) uc->uc_mcontext.mc_esp,
+ (unsigned long) uc->uc_mcontext.mc_ss,
+ (unsigned long) uc->uc_mcontext.mc_eflags,
+ (unsigned long) uc->uc_mcontext.mc_eip,
+ (unsigned long) uc->uc_mcontext.mc_cs,
+ (unsigned long) uc->uc_mcontext.mc_es,
+ (unsigned long) uc->uc_mcontext.mc_fs,
+ (unsigned long) uc->uc_mcontext.mc_gs
+ );
+ logStackContent((void**)uc->uc_mcontext.mc_esp);
+ #endif
+#elif defined(__DragonFly__)
+ serverLog(LL_WARNING,
+ "\n"
+ "RAX:%016lx RBX:%016lx\nRCX:%016lx RDX:%016lx\n"
+ "RDI:%016lx RSI:%016lx\nRBP:%016lx RSP:%016lx\n"
+ "R8 :%016lx R9 :%016lx\nR10:%016lx R11:%016lx\n"
+ "R12:%016lx R13:%016lx\nR14:%016lx R15:%016lx\n"
+ "RIP:%016lx EFL:%016lx\nCSGSFS:%016lx",
+ (unsigned long) uc->uc_mcontext.mc_rax,
+ (unsigned long) uc->uc_mcontext.mc_rbx,
+ (unsigned long) uc->uc_mcontext.mc_rcx,
+ (unsigned long) uc->uc_mcontext.mc_rdx,
+ (unsigned long) uc->uc_mcontext.mc_rdi,
+ (unsigned long) uc->uc_mcontext.mc_rsi,
+ (unsigned long) uc->uc_mcontext.mc_rbp,
+ (unsigned long) uc->uc_mcontext.mc_rsp,
+ (unsigned long) uc->uc_mcontext.mc_r8,
+ (unsigned long) uc->uc_mcontext.mc_r9,
+ (unsigned long) uc->uc_mcontext.mc_r10,
+ (unsigned long) uc->uc_mcontext.mc_r11,
+ (unsigned long) uc->uc_mcontext.mc_r12,
+ (unsigned long) uc->uc_mcontext.mc_r13,
+ (unsigned long) uc->uc_mcontext.mc_r14,
+ (unsigned long) uc->uc_mcontext.mc_r15,
+ (unsigned long) uc->uc_mcontext.mc_rip,
+ (unsigned long) uc->uc_mcontext.mc_rflags,
+ (unsigned long) uc->uc_mcontext.mc_cs
+ );
+ logStackContent((void**)uc->uc_mcontext.mc_rsp);
#else
serverLog(LL_WARNING,
" Dumping of registers not supported for this OS/arch");