import gdb import re ns_pattern = re.compile(r'nlohmann(::json_abi(?P\w*)(_v(?P\d+)_(?P\d+)_(?P\d+))?)?::(?P.+)') class JsonValuePrinter: "Print a json-value" def __init__(self, val): self.val = val def to_string(self): if self.val.type.strip_typedefs().code == gdb.TYPE_CODE_FLT: return ("%.6f" % float(self.val)).rstrip("0") return self.val def json_lookup_function(val): if m := ns_pattern.fullmatch(str(val.type.strip_typedefs().name)): name = m.group('name') if name and name.startswith('basic_json<') and name.endswith('>'): m_data = val['m_data'] m_type = m_data['m_type'] m = ns_pattern.fullmatch(str(m_type)) t = m.group('name') prefix = 'detail::value_t::' if t and t.startswith(prefix): try: union_val = m_data['m_value'][t.replace(prefix, '', 1)] if union_val.type.code == gdb.TYPE_CODE_PTR: return gdb.default_visualizer(union_val.dereference()) else: return JsonValuePrinter(union_val) except Exception: return JsonValuePrinter(m_type) gdb.pretty_printers.append(json_lookup_function)