ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# SSSD and LDB debugging plugins
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek#
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# Activate them by putting:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# source /path/to/this/file.py
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# to your .gdbinit file
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek#
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# To bypass the pretty printer and print the raw values, use the "/r" option:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# print /r foobar
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekimport gdb
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef gdb_printer_decorator(fn):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek gdb.pretty_printers.append(fn)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return fn
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef indent_string(s, indent):
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio return '\n'.join(["%s%s" % ("\t" * indent, part)
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio for part in s.split('\n')])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass StringPrinter(object):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek "Shared code between different string-printing classes"
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def __init__(self, val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek self.val = val
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def to_string(self):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return self.as_string()
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass LdbDnPrinter(StringPrinter):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek " print an ldb dn "
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def as_string(self, indent=0):
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio ret = "{ <%s>\tlinearized:%s }" % (self.val.type,
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio self.val['linearized'])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return indent_string(ret, indent)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass LdbValPrinter(StringPrinter):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek " print a ldb value"
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def as_string(self, indent=0):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret = "data = %(data)s, length = %(length)s" % self.val
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return indent_string("{ <%s>\t%s }" % (self.val.type, ret), indent)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass LdbMessageElementPrinter(StringPrinter):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek " print a ldb message element "
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def as_string(self, indent=0):
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio ret = "flags = %(flags)s, name = %(name)s, " \
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio "num_values = %(num_values)s" % self.val
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek try:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek nvals = int(self.val['num_values'])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek except ValueError:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return "num_values is not numeric?"
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek for i in range(nvals):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ldbval = LdbValPrinter(self.val['values'][i])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret += "\n%s" % (ldbval.as_string(indent+1))
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return indent_string("{ <%s>\t%s }" % (self.val.type, ret), indent)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass LdbMessagePrinter(StringPrinter):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek " print a ldb message "
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def as_string(self, indent=0):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek try:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek nels = int(self.val['num_elements'])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek except ValueError:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return "num_elements is not numeric?"
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek dn = LdbDnPrinter(self.val['dn'])
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio dn_str = dn.as_string(indent)
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio ret = "num_elements:\t%s\ndn:\t%s\nelements:\t" % (nels, dn_str)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek for i in range(nels):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek el = LdbMessageElementPrinter(self.val['elements'][i])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret += "\n%s" % (el.as_string(indent+1))
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return indent_string("{ <%s>\n%s }" % (self.val.type, ret), indent)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass LdbResultPrinter(StringPrinter):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek " print a ldb message element "
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def as_string(self, indent=0):
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio ret = "count = %(count)s, extended = %(extended)s, " \
6df8895947fbd0a01df92b82d6f418c8202595b2Fabiano Fidêncio "controls = %(controls)s, refs = %(refs)s" % self.val
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek try:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek count = int(self.val['count'])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek except ValueError:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret += 'Count is not numeric value?'
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return ret
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek for i in range(count):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek msg = LdbMessagePrinter(self.val['msgs'][i])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret += "\n%s" % (msg.as_string(indent+1))
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return indent_string("{ <%s>\t%s }" % (self.val.type, ret), indent)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass SysdbAttrsPrinter(StringPrinter):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek " print a struct sysdb attrs "
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def as_string(self, indent=0):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret = "num = %(num)s" % self.val
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek try:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek num = int(self.val['num'])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek except ValueError:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret += 'num is not numeric value?'
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return ret
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek for i in range(num):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek el = LdbMessageElementPrinter(self.val['a'][i])
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek ret += "\n%s" % (el.as_string(indent+1))
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return indent_string("{ <%s>\t%s }" % (self.val.type, ret), indent)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# ---
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# --- register pretty printers ---
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# ---
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek@gdb_printer_decorator
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef ldb_val_element_printer(val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(val.type) == 'struct ldb_dn':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return LdbDnPrinter(val)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return None
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek@gdb_printer_decorator
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef ldb_val_element_printer(val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(val.type) == 'struct ldb_val':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return LdbValPrinter(val)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return None
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek@gdb_printer_decorator
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef ldb_message_element_printer(val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(val.type) == 'struct ldb_message_element':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return LdbMessageElementPrinter(val)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return None
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek@gdb_printer_decorator
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef ldb_message_printer(val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(val.type) == 'struct ldb_message':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return LdbMessagePrinter(val)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return None
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek@gdb_printer_decorator
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef ldb_result_printer(val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(val.type) == 'struct ldb_result':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return LdbResultPrinter(val)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return None
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek@gdb_printer_decorator
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekdef sysdb_attrs_printer(val):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(val.type) == 'struct sysdb_attrs':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return SysdbAttrsPrinter(val)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return None
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# ---
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# --- set a breakpoint at the tevent_req finish fn ---
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek# ---
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozekclass TeventBreak(gdb.Command):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek """Break at the tevent finish location """
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def __init__(self):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek super(TeventBreak, self).__init__("tbr", gdb.COMMAND_BREAKPOINTS)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek def invoke(self, arg, from_tty):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek req = gdb.parse_and_eval(arg)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if not hasattr(req, 'type'):
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek print('cannot determine the type of the variable')
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek if str(req.type) != 'struct tevent_req *':
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek print('wrong attribute - must be a tevent_req pointer')
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek try:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek fn = req['async']['fn']
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek except KeyError:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek print("No async function defined?")
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek try:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek fnaddr = str(fn).split()[0].strip()
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek except IndexError:
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek print("Cannot get function address")
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek return
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek b = gdb.Breakpoint("*%s" % fnaddr)
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub Hrozek
942edc402f4acc3de4dc3ec15a89d31d9f206cf6Fabiano Fidêncio
ddb51fdac4fbb97a72ba70ae7345c62a03e90c26Jakub HrozekTeventBreak()