From 832c3014b0e3e9dfafe8c0ca56a32ff17b60e645 Mon Sep 17 00:00:00 2001 From: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 18 Feb 2025 20:15:12 -0600 Subject: [PATCH] Don't create formatters on the fly in print_terminate_trace() --- src/utils.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 9182c97..518a87a 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -27,11 +27,17 @@ namespace cpptrace { extern const int stdout_fileno = detail::fileno(stdout); extern const int stderr_fileno = detail::fileno(stderr); + namespace detail { + const formatter& get_terminate_formatter() { + static formatter the_formatter = formatter{} + .header("Stack trace to reach terminate handler (most recent call first):"); + return the_formatter; + } + } + CPPTRACE_FORCE_NO_INLINE void print_terminate_trace() { try { // try/catch can never be hit but it's needed to prevent TCO - formatter{} - .header("Stack trace to reach terminate handler (most recent call first):") - .print(std::cerr, generate_trace(1)); + detail::get_terminate_formatter().print(std::cerr, generate_trace(1)); } catch(...) { if(!detail::should_absorb_trace_exceptions()) { throw;