mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
Merge pull request #5599 from devnexen/backtrace_support_on_bsd
Backtrace/register dump on BSD.
This commit is contained in:
commit
1dd8d2c7ef
10
src/Makefile
10
src/Makefile
@ -102,14 +102,20 @@ else
|
|||||||
ifeq ($(uname_S),OpenBSD)
|
ifeq ($(uname_S),OpenBSD)
|
||||||
# OpenBSD
|
# OpenBSD
|
||||||
FINAL_LIBS+= -lpthread
|
FINAL_LIBS+= -lpthread
|
||||||
|
ifeq ($(USE_BACKTRACE),yes)
|
||||||
|
FINAL_CFLAGS+= -DUSE_BACKTRACE -I/usr/local/include
|
||||||
|
FINAL_LDFLAGS+= -L/usr/local/lib
|
||||||
|
FINAL_LIBS+= -lexecinfo
|
||||||
|
endif
|
||||||
|
|
||||||
else
|
else
|
||||||
ifeq ($(uname_S),FreeBSD)
|
ifeq ($(uname_S),FreeBSD)
|
||||||
# FreeBSD
|
# FreeBSD
|
||||||
FINAL_LIBS+= -lpthread
|
FINAL_LIBS+= -lpthread -lexecinfo
|
||||||
else
|
else
|
||||||
ifeq ($(uname_S),DragonFly)
|
ifeq ($(uname_S),DragonFly)
|
||||||
# FreeBSD
|
# FreeBSD
|
||||||
FINAL_LIBS+= -lpthread
|
FINAL_LIBS+= -lpthread -lexecinfo
|
||||||
else
|
else
|
||||||
# All the other OSes (notably Linux)
|
# All the other OSes (notably Linux)
|
||||||
FINAL_LDFLAGS+= -rdynamic
|
FINAL_LDFLAGS+= -rdynamic
|
||||||
|
@ -62,7 +62,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Test for backtrace() */
|
/* Test for backtrace() */
|
||||||
#if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__))
|
#if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__)) || \
|
||||||
|
defined(__FreeBSD__) || (defined(__OpenBSD__) && defined(USE_BACKTRACE))\
|
||||||
|
|| defined(__DragonFly__)
|
||||||
#define HAVE_BACKTRACE 1
|
#define HAVE_BACKTRACE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
159
src/debug.c
159
src/debug.c
@ -37,7 +37,11 @@
|
|||||||
|
|
||||||
#ifdef HAVE_BACKTRACE
|
#ifdef HAVE_BACKTRACE
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
|
#ifndef __OpenBSD__
|
||||||
#include <ucontext.h>
|
#include <ucontext.h>
|
||||||
|
#else
|
||||||
|
typedef ucontext_t sigcontext_t;
|
||||||
|
#endif
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include "bio.h"
|
#include "bio.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -729,6 +733,22 @@ static void *getMcontextEip(ucontext_t *uc) {
|
|||||||
#elif defined(__aarch64__) /* Linux AArch64 */
|
#elif defined(__aarch64__) /* Linux AArch64 */
|
||||||
return (void*) uc->uc_mcontext.pc;
|
return (void*) uc->uc_mcontext.pc;
|
||||||
#endif
|
#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(__OpenBSD__)
|
||||||
|
/* OpenBSD */
|
||||||
|
#if defined(__i386__)
|
||||||
|
return (void*) uc->sc_eip;
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
return (void*) uc->sc_rip;
|
||||||
|
#endif
|
||||||
|
#elif defined(__DragonFly__)
|
||||||
|
return (void*) uc->uc_mcontext.mc_rip;
|
||||||
#else
|
#else
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
@ -870,6 +890,145 @@ void logRegisters(ucontext_t *uc) {
|
|||||||
);
|
);
|
||||||
logStackContent((void**)uc->uc_mcontext.gregs[15]);
|
logStackContent((void**)uc->uc_mcontext.gregs[15]);
|
||||||
#endif
|
#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(__OpenBSD__)
|
||||||
|
#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->sc_rax,
|
||||||
|
(unsigned long) uc->sc_rbx,
|
||||||
|
(unsigned long) uc->sc_rcx,
|
||||||
|
(unsigned long) uc->sc_rdx,
|
||||||
|
(unsigned long) uc->sc_rdi,
|
||||||
|
(unsigned long) uc->sc_rsi,
|
||||||
|
(unsigned long) uc->sc_rbp,
|
||||||
|
(unsigned long) uc->sc_rsp,
|
||||||
|
(unsigned long) uc->sc_r8,
|
||||||
|
(unsigned long) uc->sc_r9,
|
||||||
|
(unsigned long) uc->sc_r10,
|
||||||
|
(unsigned long) uc->sc_r11,
|
||||||
|
(unsigned long) uc->sc_r12,
|
||||||
|
(unsigned long) uc->sc_r13,
|
||||||
|
(unsigned long) uc->sc_r14,
|
||||||
|
(unsigned long) uc->sc_r15,
|
||||||
|
(unsigned long) uc->sc_rip,
|
||||||
|
(unsigned long) uc->sc_rflags,
|
||||||
|
(unsigned long) uc->sc_cs
|
||||||
|
);
|
||||||
|
logStackContent((void**)uc->sc_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->sc_eax,
|
||||||
|
(unsigned long) uc->sc_ebx,
|
||||||
|
(unsigned long) uc->sc_ebx,
|
||||||
|
(unsigned long) uc->sc_edx,
|
||||||
|
(unsigned long) uc->sc_edi,
|
||||||
|
(unsigned long) uc->sc_esi,
|
||||||
|
(unsigned long) uc->sc_ebp,
|
||||||
|
(unsigned long) uc->sc_esp,
|
||||||
|
(unsigned long) uc->sc_ss,
|
||||||
|
(unsigned long) uc->sc_eflags,
|
||||||
|
(unsigned long) uc->sc_eip,
|
||||||
|
(unsigned long) uc->sc_cs,
|
||||||
|
(unsigned long) uc->sc_es,
|
||||||
|
(unsigned long) uc->sc_fs,
|
||||||
|
(unsigned long) uc->sc_gs
|
||||||
|
);
|
||||||
|
logStackContent((void**)uc->sc_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
|
#else
|
||||||
serverLog(LL_WARNING,
|
serverLog(LL_WARNING,
|
||||||
" Dumping of registers not supported for this OS/arch");
|
" Dumping of registers not supported for this OS/arch");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user