Move unwind to prof_sys
This commit is contained in:
parent
d128efcb6a
commit
dad821bb22
@ -14,6 +14,7 @@ void prof_bt_hash(const void *key, size_t r_hash[2]);
|
|||||||
bool prof_bt_keycomp(const void *k1, const void *k2);
|
bool prof_bt_keycomp(const void *k1, const void *k2);
|
||||||
|
|
||||||
bool prof_data_init(tsd_t *tsd);
|
bool prof_data_init(tsd_t *tsd);
|
||||||
|
prof_tctx_t *prof_lookup(tsd_t *tsd, prof_bt_t *bt);
|
||||||
char *prof_thread_name_alloc(tsd_t *tsd, const char *thread_name);
|
char *prof_thread_name_alloc(tsd_t *tsd, const char *thread_name);
|
||||||
int prof_thread_name_set_impl(tsd_t *tsd, const char *thread_name);
|
int prof_thread_name_set_impl(tsd_t *tsd, const char *thread_name);
|
||||||
void prof_dump_impl(tsd_t *tsd, prof_tdata_t *tdata,
|
void prof_dump_impl(tsd_t *tsd, prof_tdata_t *tdata,
|
||||||
@ -21,8 +22,6 @@ void prof_dump_impl(tsd_t *tsd, prof_tdata_t *tdata,
|
|||||||
prof_tdata_t * prof_tdata_init_impl(tsd_t *tsd, uint64_t thr_uid,
|
prof_tdata_t * prof_tdata_init_impl(tsd_t *tsd, uint64_t thr_uid,
|
||||||
uint64_t thr_discrim, char *thread_name, bool active);
|
uint64_t thr_discrim, char *thread_name, bool active);
|
||||||
void prof_tdata_detach(tsd_t *tsd, prof_tdata_t *tdata);
|
void prof_tdata_detach(tsd_t *tsd, prof_tdata_t *tdata);
|
||||||
void bt_init(prof_bt_t *bt, void **vec);
|
|
||||||
void prof_backtrace(tsd_t *tsd, prof_bt_t *bt);
|
|
||||||
void prof_reset(tsd_t *tsd, size_t lg_sample);
|
void prof_reset(tsd_t *tsd, size_t lg_sample);
|
||||||
void prof_tctx_try_destroy(tsd_t *tsd, prof_tctx_t *tctx);
|
void prof_tctx_try_destroy(tsd_t *tsd, prof_tctx_t *tctx);
|
||||||
|
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
extern malloc_mutex_t prof_dump_filename_mtx;
|
extern malloc_mutex_t prof_dump_filename_mtx;
|
||||||
extern base_t *prof_base;
|
extern base_t *prof_base;
|
||||||
|
|
||||||
|
void bt_init(prof_bt_t *bt, void **vec);
|
||||||
|
void prof_backtrace(tsd_t *tsd, prof_bt_t *bt);
|
||||||
|
void prof_unwind_init();
|
||||||
void prof_sys_thread_name_fetch(tsd_t *tsd);
|
void prof_sys_thread_name_fetch(tsd_t *tsd);
|
||||||
int prof_getpid(void);
|
int prof_getpid(void);
|
||||||
void prof_get_default_filename(tsdn_t *tsdn, char *filename, uint64_t ind);
|
void prof_get_default_filename(tsdn_t *tsdn, char *filename, uint64_t ind);
|
||||||
|
269
src/prof.c
269
src/prof.c
@ -19,23 +19,6 @@
|
|||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
#ifdef JEMALLOC_PROF_LIBUNWIND
|
|
||||||
#define UNW_LOCAL_ONLY
|
|
||||||
#include <libunwind.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JEMALLOC_PROF_LIBGCC
|
|
||||||
/*
|
|
||||||
* We have a circular dependency -- jemalloc_internal.h tells us if we should
|
|
||||||
* use libgcc's unwinding functionality, but after we've included that, we've
|
|
||||||
* already hooked _Unwind_Backtrace. We'll temporarily disable hooking.
|
|
||||||
*/
|
|
||||||
#undef _Unwind_Backtrace
|
|
||||||
#include <unwind.h>
|
|
||||||
#define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, test_hooks_libc_hook)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/* Data. */
|
/* Data. */
|
||||||
|
|
||||||
bool opt_prof = false;
|
bool opt_prof = false;
|
||||||
@ -147,242 +130,21 @@ prof_free_sampled_object(tsd_t *tsd, size_t usize, prof_info_t *prof_info) {
|
|||||||
prof_tctx_try_destroy(tsd, tctx);
|
prof_tctx_try_destroy(tsd, tctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
prof_tctx_t *
|
||||||
bt_init(prof_bt_t *bt, void **vec) {
|
prof_tctx_create(tsd_t *tsd) {
|
||||||
cassert(config_prof);
|
if (!tsd_nominal(tsd) || tsd_reentrancy_level_get(tsd) > 0) {
|
||||||
|
return NULL;
|
||||||
bt->vec = vec;
|
|
||||||
bt->len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef JEMALLOC_PROF_LIBUNWIND
|
|
||||||
static void
|
|
||||||
prof_backtrace_impl(prof_bt_t *bt) {
|
|
||||||
int nframes;
|
|
||||||
|
|
||||||
cassert(config_prof);
|
|
||||||
assert(bt->len == 0);
|
|
||||||
assert(bt->vec != NULL);
|
|
||||||
|
|
||||||
nframes = unw_backtrace(bt->vec, PROF_BT_MAX);
|
|
||||||
if (nframes <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bt->len = nframes;
|
|
||||||
}
|
|
||||||
#elif (defined(JEMALLOC_PROF_LIBGCC))
|
|
||||||
static _Unwind_Reason_Code
|
|
||||||
prof_unwind_init_callback(struct _Unwind_Context *context, void *arg) {
|
|
||||||
cassert(config_prof);
|
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
|
||||||
}
|
|
||||||
|
|
||||||
static _Unwind_Reason_Code
|
|
||||||
prof_unwind_callback(struct _Unwind_Context *context, void *arg) {
|
|
||||||
prof_unwind_data_t *data = (prof_unwind_data_t *)arg;
|
|
||||||
void *ip;
|
|
||||||
|
|
||||||
cassert(config_prof);
|
|
||||||
|
|
||||||
ip = (void *)_Unwind_GetIP(context);
|
|
||||||
if (ip == NULL) {
|
|
||||||
return _URC_END_OF_STACK;
|
|
||||||
}
|
|
||||||
data->bt->vec[data->bt->len] = ip;
|
|
||||||
data->bt->len++;
|
|
||||||
if (data->bt->len == data->max) {
|
|
||||||
return _URC_END_OF_STACK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
prof_tdata_t *tdata = prof_tdata_get(tsd, true);
|
||||||
}
|
if (tdata == NULL) {
|
||||||
|
return NULL;
|
||||||
static void
|
|
||||||
prof_backtrace_impl(prof_bt_t *bt) {
|
|
||||||
prof_unwind_data_t data = {bt, PROF_BT_MAX};
|
|
||||||
|
|
||||||
cassert(config_prof);
|
|
||||||
|
|
||||||
_Unwind_Backtrace(prof_unwind_callback, &data);
|
|
||||||
}
|
|
||||||
#elif (defined(JEMALLOC_PROF_GCC))
|
|
||||||
static void
|
|
||||||
prof_backtrace_impl(prof_bt_t *bt) {
|
|
||||||
#define BT_FRAME(i) \
|
|
||||||
if ((i) < PROF_BT_MAX) { \
|
|
||||||
void *p; \
|
|
||||||
if (__builtin_frame_address(i) == 0) { \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
p = __builtin_return_address(i); \
|
|
||||||
if (p == NULL) { \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
bt->vec[(i)] = p; \
|
|
||||||
bt->len = (i) + 1; \
|
|
||||||
} else { \
|
|
||||||
return; \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cassert(config_prof);
|
prof_bt_t bt;
|
||||||
|
bt_init(&bt, tdata->vec);
|
||||||
BT_FRAME(0)
|
prof_backtrace(tsd, &bt);
|
||||||
BT_FRAME(1)
|
return prof_lookup(tsd, &bt);
|
||||||
BT_FRAME(2)
|
|
||||||
BT_FRAME(3)
|
|
||||||
BT_FRAME(4)
|
|
||||||
BT_FRAME(5)
|
|
||||||
BT_FRAME(6)
|
|
||||||
BT_FRAME(7)
|
|
||||||
BT_FRAME(8)
|
|
||||||
BT_FRAME(9)
|
|
||||||
|
|
||||||
BT_FRAME(10)
|
|
||||||
BT_FRAME(11)
|
|
||||||
BT_FRAME(12)
|
|
||||||
BT_FRAME(13)
|
|
||||||
BT_FRAME(14)
|
|
||||||
BT_FRAME(15)
|
|
||||||
BT_FRAME(16)
|
|
||||||
BT_FRAME(17)
|
|
||||||
BT_FRAME(18)
|
|
||||||
BT_FRAME(19)
|
|
||||||
|
|
||||||
BT_FRAME(20)
|
|
||||||
BT_FRAME(21)
|
|
||||||
BT_FRAME(22)
|
|
||||||
BT_FRAME(23)
|
|
||||||
BT_FRAME(24)
|
|
||||||
BT_FRAME(25)
|
|
||||||
BT_FRAME(26)
|
|
||||||
BT_FRAME(27)
|
|
||||||
BT_FRAME(28)
|
|
||||||
BT_FRAME(29)
|
|
||||||
|
|
||||||
BT_FRAME(30)
|
|
||||||
BT_FRAME(31)
|
|
||||||
BT_FRAME(32)
|
|
||||||
BT_FRAME(33)
|
|
||||||
BT_FRAME(34)
|
|
||||||
BT_FRAME(35)
|
|
||||||
BT_FRAME(36)
|
|
||||||
BT_FRAME(37)
|
|
||||||
BT_FRAME(38)
|
|
||||||
BT_FRAME(39)
|
|
||||||
|
|
||||||
BT_FRAME(40)
|
|
||||||
BT_FRAME(41)
|
|
||||||
BT_FRAME(42)
|
|
||||||
BT_FRAME(43)
|
|
||||||
BT_FRAME(44)
|
|
||||||
BT_FRAME(45)
|
|
||||||
BT_FRAME(46)
|
|
||||||
BT_FRAME(47)
|
|
||||||
BT_FRAME(48)
|
|
||||||
BT_FRAME(49)
|
|
||||||
|
|
||||||
BT_FRAME(50)
|
|
||||||
BT_FRAME(51)
|
|
||||||
BT_FRAME(52)
|
|
||||||
BT_FRAME(53)
|
|
||||||
BT_FRAME(54)
|
|
||||||
BT_FRAME(55)
|
|
||||||
BT_FRAME(56)
|
|
||||||
BT_FRAME(57)
|
|
||||||
BT_FRAME(58)
|
|
||||||
BT_FRAME(59)
|
|
||||||
|
|
||||||
BT_FRAME(60)
|
|
||||||
BT_FRAME(61)
|
|
||||||
BT_FRAME(62)
|
|
||||||
BT_FRAME(63)
|
|
||||||
BT_FRAME(64)
|
|
||||||
BT_FRAME(65)
|
|
||||||
BT_FRAME(66)
|
|
||||||
BT_FRAME(67)
|
|
||||||
BT_FRAME(68)
|
|
||||||
BT_FRAME(69)
|
|
||||||
|
|
||||||
BT_FRAME(70)
|
|
||||||
BT_FRAME(71)
|
|
||||||
BT_FRAME(72)
|
|
||||||
BT_FRAME(73)
|
|
||||||
BT_FRAME(74)
|
|
||||||
BT_FRAME(75)
|
|
||||||
BT_FRAME(76)
|
|
||||||
BT_FRAME(77)
|
|
||||||
BT_FRAME(78)
|
|
||||||
BT_FRAME(79)
|
|
||||||
|
|
||||||
BT_FRAME(80)
|
|
||||||
BT_FRAME(81)
|
|
||||||
BT_FRAME(82)
|
|
||||||
BT_FRAME(83)
|
|
||||||
BT_FRAME(84)
|
|
||||||
BT_FRAME(85)
|
|
||||||
BT_FRAME(86)
|
|
||||||
BT_FRAME(87)
|
|
||||||
BT_FRAME(88)
|
|
||||||
BT_FRAME(89)
|
|
||||||
|
|
||||||
BT_FRAME(90)
|
|
||||||
BT_FRAME(91)
|
|
||||||
BT_FRAME(92)
|
|
||||||
BT_FRAME(93)
|
|
||||||
BT_FRAME(94)
|
|
||||||
BT_FRAME(95)
|
|
||||||
BT_FRAME(96)
|
|
||||||
BT_FRAME(97)
|
|
||||||
BT_FRAME(98)
|
|
||||||
BT_FRAME(99)
|
|
||||||
|
|
||||||
BT_FRAME(100)
|
|
||||||
BT_FRAME(101)
|
|
||||||
BT_FRAME(102)
|
|
||||||
BT_FRAME(103)
|
|
||||||
BT_FRAME(104)
|
|
||||||
BT_FRAME(105)
|
|
||||||
BT_FRAME(106)
|
|
||||||
BT_FRAME(107)
|
|
||||||
BT_FRAME(108)
|
|
||||||
BT_FRAME(109)
|
|
||||||
|
|
||||||
BT_FRAME(110)
|
|
||||||
BT_FRAME(111)
|
|
||||||
BT_FRAME(112)
|
|
||||||
BT_FRAME(113)
|
|
||||||
BT_FRAME(114)
|
|
||||||
BT_FRAME(115)
|
|
||||||
BT_FRAME(116)
|
|
||||||
BT_FRAME(117)
|
|
||||||
BT_FRAME(118)
|
|
||||||
BT_FRAME(119)
|
|
||||||
|
|
||||||
BT_FRAME(120)
|
|
||||||
BT_FRAME(121)
|
|
||||||
BT_FRAME(122)
|
|
||||||
BT_FRAME(123)
|
|
||||||
BT_FRAME(124)
|
|
||||||
BT_FRAME(125)
|
|
||||||
BT_FRAME(126)
|
|
||||||
BT_FRAME(127)
|
|
||||||
#undef BT_FRAME
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
prof_backtrace_impl(prof_bt_t *bt) {
|
|
||||||
cassert(config_prof);
|
|
||||||
not_reached();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
prof_backtrace(tsd_t *tsd, prof_bt_t *bt) {
|
|
||||||
cassert(config_prof);
|
|
||||||
pre_reentrancy(tsd, NULL);
|
|
||||||
prof_backtrace_impl(bt);
|
|
||||||
post_reentrancy(tsd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -852,13 +614,8 @@ prof_boot2(tsd_t *tsd, base_t *base) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef JEMALLOC_PROF_LIBGCC
|
|
||||||
/*
|
prof_unwind_init();
|
||||||
* Cause the backtracing machinery to allocate its internal
|
|
||||||
* state before enabling profiling.
|
|
||||||
*/
|
|
||||||
_Unwind_Backtrace(prof_unwind_init_callback, NULL);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
prof_booted = true;
|
prof_booted = true;
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ prof_lookup_global(tsd_t *tsd, prof_bt_t *bt, prof_tdata_t *tdata,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static prof_tctx_t *
|
prof_tctx_t *
|
||||||
prof_lookup(tsd_t *tsd, prof_bt_t *bt) {
|
prof_lookup(tsd_t *tsd, prof_bt_t *bt) {
|
||||||
union {
|
union {
|
||||||
prof_tctx_t *p;
|
prof_tctx_t *p;
|
||||||
@ -395,23 +395,6 @@ prof_lookup(tsd_t *tsd, prof_bt_t *bt) {
|
|||||||
return ret.p;
|
return ret.p;
|
||||||
}
|
}
|
||||||
|
|
||||||
prof_tctx_t *
|
|
||||||
prof_tctx_create(tsd_t *tsd) {
|
|
||||||
if (!tsd_nominal(tsd) || tsd_reentrancy_level_get(tsd) > 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
prof_tdata_t *tdata = prof_tdata_get(tsd, true);
|
|
||||||
if (tdata == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
prof_bt_t bt;
|
|
||||||
bt_init(&bt, tdata->vec);
|
|
||||||
prof_backtrace(tsd, &bt);
|
|
||||||
return prof_lookup(tsd, &bt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Used in unit tests. */
|
/* Used in unit tests. */
|
||||||
static prof_tdata_t *
|
static prof_tdata_t *
|
||||||
prof_tdata_count_iter(prof_tdata_tree_t *tdatas, prof_tdata_t *tdata,
|
prof_tdata_count_iter(prof_tdata_tree_t *tdatas, prof_tdata_t *tdata,
|
||||||
|
266
src/prof_sys.c
266
src/prof_sys.c
@ -6,6 +6,24 @@
|
|||||||
#include "jemalloc/internal/prof_data.h"
|
#include "jemalloc/internal/prof_data.h"
|
||||||
#include "jemalloc/internal/prof_sys.h"
|
#include "jemalloc/internal/prof_sys.h"
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_PROF_LIBUNWIND
|
||||||
|
#define UNW_LOCAL_ONLY
|
||||||
|
#include <libunwind.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_PROF_LIBGCC
|
||||||
|
/*
|
||||||
|
* We have a circular dependency -- jemalloc_internal.h tells us if we should
|
||||||
|
* use libgcc's unwinding functionality, but after we've included that, we've
|
||||||
|
* already hooked _Unwind_Backtrace. We'll temporarily disable hooking.
|
||||||
|
*/
|
||||||
|
#undef _Unwind_Backtrace
|
||||||
|
#include <unwind.h>
|
||||||
|
#define _Unwind_Backtrace JEMALLOC_HOOK(_Unwind_Backtrace, test_hooks_libc_hook)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
malloc_mutex_t prof_dump_filename_mtx;
|
malloc_mutex_t prof_dump_filename_mtx;
|
||||||
|
|
||||||
static uint64_t prof_dump_seq;
|
static uint64_t prof_dump_seq;
|
||||||
@ -40,6 +58,254 @@ static char prof_dump_buf[PROF_DUMP_BUFSIZE];
|
|||||||
static size_t prof_dump_buf_end;
|
static size_t prof_dump_buf_end;
|
||||||
static int prof_dump_fd;
|
static int prof_dump_fd;
|
||||||
|
|
||||||
|
void
|
||||||
|
bt_init(prof_bt_t *bt, void **vec) {
|
||||||
|
cassert(config_prof);
|
||||||
|
|
||||||
|
bt->vec = vec;
|
||||||
|
bt->len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_PROF_LIBUNWIND
|
||||||
|
static void
|
||||||
|
prof_backtrace_impl(prof_bt_t *bt) {
|
||||||
|
int nframes;
|
||||||
|
|
||||||
|
cassert(config_prof);
|
||||||
|
assert(bt->len == 0);
|
||||||
|
assert(bt->vec != NULL);
|
||||||
|
|
||||||
|
nframes = unw_backtrace(bt->vec, PROF_BT_MAX);
|
||||||
|
if (nframes <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bt->len = nframes;
|
||||||
|
}
|
||||||
|
#elif (defined(JEMALLOC_PROF_LIBGCC))
|
||||||
|
static _Unwind_Reason_Code
|
||||||
|
prof_unwind_init_callback(struct _Unwind_Context *context, void *arg) {
|
||||||
|
cassert(config_prof);
|
||||||
|
|
||||||
|
return _URC_NO_REASON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static _Unwind_Reason_Code
|
||||||
|
prof_unwind_callback(struct _Unwind_Context *context, void *arg) {
|
||||||
|
prof_unwind_data_t *data = (prof_unwind_data_t *)arg;
|
||||||
|
void *ip;
|
||||||
|
|
||||||
|
cassert(config_prof);
|
||||||
|
|
||||||
|
ip = (void *)_Unwind_GetIP(context);
|
||||||
|
if (ip == NULL) {
|
||||||
|
return _URC_END_OF_STACK;
|
||||||
|
}
|
||||||
|
data->bt->vec[data->bt->len] = ip;
|
||||||
|
data->bt->len++;
|
||||||
|
if (data->bt->len == data->max) {
|
||||||
|
return _URC_END_OF_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _URC_NO_REASON;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
prof_backtrace_impl(prof_bt_t *bt) {
|
||||||
|
prof_unwind_data_t data = {bt, PROF_BT_MAX};
|
||||||
|
|
||||||
|
cassert(config_prof);
|
||||||
|
|
||||||
|
_Unwind_Backtrace(prof_unwind_callback, &data);
|
||||||
|
}
|
||||||
|
#elif (defined(JEMALLOC_PROF_GCC))
|
||||||
|
static void
|
||||||
|
prof_backtrace_impl(prof_bt_t *bt) {
|
||||||
|
#define BT_FRAME(i) \
|
||||||
|
if ((i) < PROF_BT_MAX) { \
|
||||||
|
void *p; \
|
||||||
|
if (__builtin_frame_address(i) == 0) { \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
p = __builtin_return_address(i); \
|
||||||
|
if (p == NULL) { \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
bt->vec[(i)] = p; \
|
||||||
|
bt->len = (i) + 1; \
|
||||||
|
} else { \
|
||||||
|
return; \
|
||||||
|
}
|
||||||
|
|
||||||
|
cassert(config_prof);
|
||||||
|
|
||||||
|
BT_FRAME(0)
|
||||||
|
BT_FRAME(1)
|
||||||
|
BT_FRAME(2)
|
||||||
|
BT_FRAME(3)
|
||||||
|
BT_FRAME(4)
|
||||||
|
BT_FRAME(5)
|
||||||
|
BT_FRAME(6)
|
||||||
|
BT_FRAME(7)
|
||||||
|
BT_FRAME(8)
|
||||||
|
BT_FRAME(9)
|
||||||
|
|
||||||
|
BT_FRAME(10)
|
||||||
|
BT_FRAME(11)
|
||||||
|
BT_FRAME(12)
|
||||||
|
BT_FRAME(13)
|
||||||
|
BT_FRAME(14)
|
||||||
|
BT_FRAME(15)
|
||||||
|
BT_FRAME(16)
|
||||||
|
BT_FRAME(17)
|
||||||
|
BT_FRAME(18)
|
||||||
|
BT_FRAME(19)
|
||||||
|
|
||||||
|
BT_FRAME(20)
|
||||||
|
BT_FRAME(21)
|
||||||
|
BT_FRAME(22)
|
||||||
|
BT_FRAME(23)
|
||||||
|
BT_FRAME(24)
|
||||||
|
BT_FRAME(25)
|
||||||
|
BT_FRAME(26)
|
||||||
|
BT_FRAME(27)
|
||||||
|
BT_FRAME(28)
|
||||||
|
BT_FRAME(29)
|
||||||
|
|
||||||
|
BT_FRAME(30)
|
||||||
|
BT_FRAME(31)
|
||||||
|
BT_FRAME(32)
|
||||||
|
BT_FRAME(33)
|
||||||
|
BT_FRAME(34)
|
||||||
|
BT_FRAME(35)
|
||||||
|
BT_FRAME(36)
|
||||||
|
BT_FRAME(37)
|
||||||
|
BT_FRAME(38)
|
||||||
|
BT_FRAME(39)
|
||||||
|
|
||||||
|
BT_FRAME(40)
|
||||||
|
BT_FRAME(41)
|
||||||
|
BT_FRAME(42)
|
||||||
|
BT_FRAME(43)
|
||||||
|
BT_FRAME(44)
|
||||||
|
BT_FRAME(45)
|
||||||
|
BT_FRAME(46)
|
||||||
|
BT_FRAME(47)
|
||||||
|
BT_FRAME(48)
|
||||||
|
BT_FRAME(49)
|
||||||
|
|
||||||
|
BT_FRAME(50)
|
||||||
|
BT_FRAME(51)
|
||||||
|
BT_FRAME(52)
|
||||||
|
BT_FRAME(53)
|
||||||
|
BT_FRAME(54)
|
||||||
|
BT_FRAME(55)
|
||||||
|
BT_FRAME(56)
|
||||||
|
BT_FRAME(57)
|
||||||
|
BT_FRAME(58)
|
||||||
|
BT_FRAME(59)
|
||||||
|
|
||||||
|
BT_FRAME(60)
|
||||||
|
BT_FRAME(61)
|
||||||
|
BT_FRAME(62)
|
||||||
|
BT_FRAME(63)
|
||||||
|
BT_FRAME(64)
|
||||||
|
BT_FRAME(65)
|
||||||
|
BT_FRAME(66)
|
||||||
|
BT_FRAME(67)
|
||||||
|
BT_FRAME(68)
|
||||||
|
BT_FRAME(69)
|
||||||
|
|
||||||
|
BT_FRAME(70)
|
||||||
|
BT_FRAME(71)
|
||||||
|
BT_FRAME(72)
|
||||||
|
BT_FRAME(73)
|
||||||
|
BT_FRAME(74)
|
||||||
|
BT_FRAME(75)
|
||||||
|
BT_FRAME(76)
|
||||||
|
BT_FRAME(77)
|
||||||
|
BT_FRAME(78)
|
||||||
|
BT_FRAME(79)
|
||||||
|
|
||||||
|
BT_FRAME(80)
|
||||||
|
BT_FRAME(81)
|
||||||
|
BT_FRAME(82)
|
||||||
|
BT_FRAME(83)
|
||||||
|
BT_FRAME(84)
|
||||||
|
BT_FRAME(85)
|
||||||
|
BT_FRAME(86)
|
||||||
|
BT_FRAME(87)
|
||||||
|
BT_FRAME(88)
|
||||||
|
BT_FRAME(89)
|
||||||
|
|
||||||
|
BT_FRAME(90)
|
||||||
|
BT_FRAME(91)
|
||||||
|
BT_FRAME(92)
|
||||||
|
BT_FRAME(93)
|
||||||
|
BT_FRAME(94)
|
||||||
|
BT_FRAME(95)
|
||||||
|
BT_FRAME(96)
|
||||||
|
BT_FRAME(97)
|
||||||
|
BT_FRAME(98)
|
||||||
|
BT_FRAME(99)
|
||||||
|
|
||||||
|
BT_FRAME(100)
|
||||||
|
BT_FRAME(101)
|
||||||
|
BT_FRAME(102)
|
||||||
|
BT_FRAME(103)
|
||||||
|
BT_FRAME(104)
|
||||||
|
BT_FRAME(105)
|
||||||
|
BT_FRAME(106)
|
||||||
|
BT_FRAME(107)
|
||||||
|
BT_FRAME(108)
|
||||||
|
BT_FRAME(109)
|
||||||
|
|
||||||
|
BT_FRAME(110)
|
||||||
|
BT_FRAME(111)
|
||||||
|
BT_FRAME(112)
|
||||||
|
BT_FRAME(113)
|
||||||
|
BT_FRAME(114)
|
||||||
|
BT_FRAME(115)
|
||||||
|
BT_FRAME(116)
|
||||||
|
BT_FRAME(117)
|
||||||
|
BT_FRAME(118)
|
||||||
|
BT_FRAME(119)
|
||||||
|
|
||||||
|
BT_FRAME(120)
|
||||||
|
BT_FRAME(121)
|
||||||
|
BT_FRAME(122)
|
||||||
|
BT_FRAME(123)
|
||||||
|
BT_FRAME(124)
|
||||||
|
BT_FRAME(125)
|
||||||
|
BT_FRAME(126)
|
||||||
|
BT_FRAME(127)
|
||||||
|
#undef BT_FRAME
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void
|
||||||
|
prof_backtrace_impl(prof_bt_t *bt) {
|
||||||
|
cassert(config_prof);
|
||||||
|
not_reached();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
prof_backtrace(tsd_t *tsd, prof_bt_t *bt) {
|
||||||
|
cassert(config_prof);
|
||||||
|
pre_reentrancy(tsd, NULL);
|
||||||
|
prof_backtrace_impl(bt);
|
||||||
|
post_reentrancy(tsd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void prof_unwind_init() {
|
||||||
|
#ifdef JEMALLOC_PROF_LIBGCC
|
||||||
|
/*
|
||||||
|
* Cause the backtracing machinery to allocate its internal
|
||||||
|
* state before enabling profiling.
|
||||||
|
*/
|
||||||
|
_Unwind_Backtrace(prof_unwind_init_callback, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
prof_sys_thread_name_read_impl(char *buf, size_t limit) {
|
prof_sys_thread_name_read_impl(char *buf, size_t limit) {
|
||||||
#ifdef JEMALLOC_HAVE_PTHREAD_SETNAME_NP
|
#ifdef JEMALLOC_HAVE_PTHREAD_SETNAME_NP
|
||||||
|
Loading…
Reference in New Issue
Block a user