Skip to content

Instantly share code, notes, and snippets.

@ssbssa
Created December 24, 2020 13:58

Revisions

  1. ssbssa created this gist Dec 24, 2020.
    29 changes: 29 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    (gdb) p -pretty on -array on -- mixed_nested
    $1 = std::map with 5 elements = {
    ["Baptiste"] = std::map with 1 element = {
    ["first"] = "second"
    },
    ["Emmanuel"] = std::vector of length 3, capacity 3 = {
    3,
    "25",
    0.5
    },
    ["Jean"] = 0.7,
    ["Zorg"] = std::map with 8 elements = {
    ["array"] = std::vector of length 3, capacity 3 = {
    1,
    0,
    2
    },
    ["awesome_str"] = "bleh",
    ["bool"] = true,
    ["flex"] = 0.2,
    ["float"] = 5.22,
    ["int"] = 5,
    ["nested"] = std::map with 1 element = {
    ["bar"] = "barz"
    },
    ["trap "] = "you fell"
    },
    ["empty"] = nlohmann::detail::value_t::null
    }
    28 changes: 28 additions & 0 deletions nlohmann-json.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,28 @@
    import gdb
    import re

    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 re.search("^nlohmann::basic_json<.*>$", val.type.strip_typedefs().name):
    t = str(val['m_type'])
    if t.startswith("nlohmann::detail::value_t::"):
    try:
    union_val = val['m_value'][t[27:]]
    if union_val.type.code == gdb.TYPE_CODE_PTR:
    return gdb.default_visualizer(union_val.dereference())
    else:
    return JsonValuePrinter(union_val)
    except:
    return JsonValuePrinter(val['m_type'])

    gdb.pretty_printers.append(json_lookup_function)