Skip to content

Commit 71ae67a

Browse files
committed
Move backtrace_create_state to startup to avoid malloc in signal handler
Signed-off-by: Hanxi Zhang <hanxizh@amazon.com>
1 parent 083c135 commit 71ae67a

3 files changed

Lines changed: 14 additions & 3 deletions

File tree

src/debug.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,11 +1741,16 @@ static void bt_simple_error_cb(void *data, const char *msg, int errnum) {
17411741
(void)errnum;
17421742
}
17431743

1744+
static struct backtrace_state *bt_frame_state = NULL;
1745+
1746+
void initLibbacktraceFrameState(void) {
1747+
bt_frame_state = backtrace_create_state(NULL, 0, bt_simple_error_cb, NULL);
1748+
}
1749+
17441750
static int valkey_backtrace(void **trace, int max_size) {
1745-
struct backtrace_state *state = backtrace_create_state(NULL, 0, bt_simple_error_cb, NULL);
1746-
if (!state) return 0;
1751+
if (!bt_frame_state) return 0;
17471752
struct bt_collect_data data = {trace, max_size, 0};
1748-
backtrace_simple(state, 0, bt_simple_collect_cb, bt_simple_error_cb, &data);
1753+
backtrace_simple(bt_frame_state, 0, bt_simple_collect_cb, bt_simple_error_cb, &data);
17491754
return data.count;
17501755
}
17511756

src/server.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2912,6 +2912,9 @@ void initServer(void) {
29122912
signal(SIGHUP, SIG_IGN);
29132913
signal(SIGPIPE, SIG_IGN);
29142914
setupSignalHandlers();
2915+
#if defined(USE_LIBBACKTRACE) && !defined(HAVE_EXECINFO)
2916+
initLibbacktraceFrameState();
2917+
#endif
29152918
ThreadsManager_init();
29162919
makeThreadKillable();
29172920

src/server.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3439,6 +3439,9 @@ int processCommand(client *c);
34393439
int processPendingCommandAndInputBuffer(client *c);
34403440
int processCommandAndResetClient(client *c);
34413441
void setupSignalHandlers(void);
3442+
#if defined(USE_LIBBACKTRACE) && !defined(HAVE_EXECINFO)
3443+
void initLibbacktraceFrameState(void);
3444+
#endif
34423445
int createSocketAcceptHandler(connListener *sfd, aeFileProc *accept_handler);
34433446
connListener *listenerByType(int type);
34443447
int changeListener(connListener *listener);

0 commit comments

Comments
 (0)