From fa9008b8a791ab4978777a111bbbd9b636335750 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 15 Oct 2025 21:44:16 +0100 Subject: [PATCH] libstdc++: Add pretty printers for std::stacktrace libstdc++-v3/ChangeLog: * python/libstdcxx/v6/printers.py (StdStacktraceEntryPrinter): New printer for std::stacktrace_entry. (StdStacktracePrinter): New printer for std::basic_stacktrace. --- libstdc++-v3/python/libstdcxx/v6/printers.py | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index 1822d425f88e..7a5a627479fd 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -2357,6 +2357,37 @@ class StdTextEncodingPrinter(printer_base): return 'unknown' return rep['_M_name'] +class StdStacktraceEntryPrinter(printer_base): + """Print a std::stacktrace_entry.""" + + def __init__(self, typename, val): + self._val = val + self._typename = typename + + def to_string(self): + block = gdb.current_progspace().block_for_pc(self._val['_M_pc']) + if block is None or block.function is None: + return "" + sym = block.function + return "{{{} at {}:{}}}".format(sym.print_name, sym.symtab.filename, sym.line) + +class StdStacktracePrinter(printer_base): + """Print a std::stacktrace.""" + + def __init__(self, typename, val): + self._val = val + self._typename = typename + self._size = self._val['_M_impl']['_M_size'] + + def to_string(self): + return '%s of length %d' % (self._typename, self._size) + + def children(self): + return StdSpanPrinter._iterator(self._val['_M_impl']['_M_frames'], self._size) + + def display_hint(self): + return 'array' + # A "regular expression" printer which conforms to the # "SubPrettyPrinter" protocol from gdb.printing. class RxPrinter(object): @@ -2977,6 +3008,12 @@ def build_libstdcxx_dictionary(): # libstdcxx_printer.add_version('std::chrono::(anonymous namespace)', 'Rule', # StdChronoTimeZoneRulePrinter) + # C++23 components + libstdcxx_printer.add_version('std::', 'stacktrace_entry', + StdStacktraceEntryPrinter) + libstdcxx_printer.add_version('std::', 'basic_stacktrace', + StdStacktracePrinter) + # C++26 components libstdcxx_printer.add_version('std::', 'text_encoding', StdTextEncodingPrinter)