diff --git a/core/trace.cc b/core/trace.cc index 5ad0a46a520311423b84d7475bcffe3a6a3cf199..de947eaca5fdc31b7c8222e476e1fb85a8961c52 100644 --- a/core/trace.cc +++ b/core/trace.cc @@ -47,7 +47,7 @@ tracepoint_patch_sites_type tracepoint_patch_sites; constexpr size_t trace_page_size = 4096; // need not match arch page size constexpr unsigned max_trace = trace_page_size * 1024; -char trace_log[max_trace] __attribute__((may_alias, aligned(sizeof(long)))); +char *trace_log __attribute__((may_alias)); std::atomic<size_t> trace_record_last; bool trace_enabled; @@ -62,6 +62,10 @@ void enable_trace() void enable_tracepoint(std::string wildcard) { + if (!trace_log) { + trace_log = (char *) aligned_alloc(sizeof(long), max_trace); + bzero(trace_log, max_trace); + } wildcard = boost::algorithm::replace_all_copy(wildcard, std::string("*"), std::string(".*")); wildcard = boost::algorithm::replace_all_copy(wildcard, std::string("?"), std::string(".")); std::regex re{wildcard}; diff --git a/scripts/loader.py b/scripts/loader.py index 6c7e6d3b3d4ec8cb14607718334a4de8e88213e6..86a48c6ef704588cb7cc2558ac0ba76ff21e7192 100644 --- a/scripts/loader.py +++ b/scripts/loader.py @@ -826,8 +826,10 @@ def all_traces(): inf = gdb.selected_inferior() trace_log = gdb.lookup_global_symbol('trace_log').value() + if not trace_log: + return max_trace = ulong(gdb.parse_and_eval('max_trace')) - trace_log = inf.read_memory(trace_log.address, max_trace) + trace_log = inf.read_memory(trace_log, max_trace) trace_page_size = ulong(gdb.parse_and_eval('trace_page_size')) last = ulong(gdb.lookup_global_symbol('trace_record_last').value()['_M_i']) last %= max_trace