From 0fda4a88edbb24dda1bfccfc0e81d7fac25d50d8 Mon Sep 17 00:00:00 2001 From: Jeremy <51220084+jeremy-rifkin@users.noreply.github.com> Date: Wed, 28 Feb 2024 20:53:28 -0600 Subject: [PATCH] Refactor stack trace frame printing --- src/cpptrace.cpp | 118 +++++++++++++++++++++++++---------------------- 1 file changed, 64 insertions(+), 54 deletions(-) diff --git a/src/cpptrace.cpp b/src/cpptrace.cpp index 44ea0b7..0bba379 100644 --- a/src/cpptrace.cpp +++ b/src/cpptrace.cpp @@ -166,6 +166,69 @@ namespace cpptrace { print(stream, color, true, nullptr); } + void print_frame( + std::ostream& stream, + bool color, + unsigned frame_number_width, + std::size_t counter, + const stacktrace_frame& frame + ) { + const auto reset = color ? ESC "0m" : ""; + const auto green = color ? ESC "32m" : ""; + const auto yellow = color ? ESC "33m" : ""; + const auto blue = color ? ESC "34m" : ""; + stream + << '#' + << std::setw(static_cast(frame_number_width)) + << std::left + << counter + << std::right + << " "; + if(frame.is_inline) { + stream + << std::setw(2 * sizeof(frame_ptr) + 2) + << "(inlined)"; + } else { + stream + << std::hex + << blue + << "0x" + << std::setw(2 * sizeof(frame_ptr)) + << std::setfill('0') + << frame.raw_address + << std::dec + << std::setfill(' ') + << reset; + } + if(!frame.symbol.empty()) { + stream + << " in " + << yellow + << frame.symbol + << reset; + } + if(!frame.filename.empty()) { + stream + << " at " + << green + << frame.filename + << reset; + if(frame.line.has_value()) { + stream + << ":" + << blue + << frame.line.value() + << reset; + if(frame.column.has_value()) { + stream << ':' + << blue + << std::to_string(frame.column.value()) + << reset; + } + } + } + } + void stacktrace::print(std::ostream& stream, bool color, bool newline_at_end, const char* header) const { if( color && ( @@ -180,62 +243,9 @@ namespace cpptrace { stream<<"" << '\n'; return; } - const auto reset = color ? ESC "0m" : ""; - const auto green = color ? ESC "32m" : ""; - const auto yellow = color ? ESC "33m" : ""; - const auto blue = color ? ESC "34m" : ""; const auto frame_number_width = detail::n_digits(static_cast(frames.size()) - 1); for(const auto& frame : frames) { - stream - << '#' - << std::setw(static_cast(frame_number_width)) - << std::left - << counter - << std::right - << " "; - if(frame.is_inline) { - stream - << std::setw(2 * sizeof(frame_ptr) + 2) - << "(inlined)"; - } else { - stream - << std::hex - << blue - << "0x" - << std::setw(2 * sizeof(frame_ptr)) - << std::setfill('0') - << frame.raw_address - << std::dec - << std::setfill(' ') - << reset; - } - if(!frame.symbol.empty()) { - stream - << " in " - << yellow - << frame.symbol - << reset; - } - if(!frame.filename.empty()) { - stream - << " at " - << green - << frame.filename - << reset; - if(frame.line.has_value()) { - stream - << ":" - << blue - << frame.line.value() - << reset; - if(frame.column.has_value()) { - stream << ':' - << blue - << std::to_string(frame.column.value()) - << reset; - } - } - } + print_frame(stream, color, frame_number_width, counter, frame); if(newline_at_end || &frame != &frames.back()) { stream << '\n'; }