Re: help with pretty printing

xgsa
2012-06-02T10:29:15Z

You could try the Qt pretty from here:
https://projects.kde.org/projects/extragear/kdevelop/kdevelop/repository/revisions/4.1/show/debuggers/gdb/printers

If they work properly you could compare their implementation with yours
or just use them.

Anton.

-------- Original message --------
> I am writing some gdb pretty printers for Qt classes to be used in the
> Eclipse IDE, but cannot seem to handle pointers to data structures very well
> (I am very new to Python)
>
> For example I want to pretty print the QFile structure which I have achieved
> with following code –
>
> class QFilePrinter:
> def __init__(self, val):
> self.val = val
> data = self.val['d_ptr']['d'].dereference()
>
> def children(self):
> names = [1,2]
> data = self.val['d_ptr']['d']
> for i in names:
> if i==1:
> ptype = gdb.lookup_type("QFilePrivate").pointer()
> yield "fileName",data.cast(ptype).dereference()["fileName"]
> if i == 2:
> exp = "((class QFile*)%s)->exists()" % (self.val.address)
> r = callClassMethod(self.val, "exists","")
> yield "exists",r
>
> def to_string (self):
> data = self.val['d_ptr']['d']
> ptype = gdb.lookup_type("QFilePrivate").pointer()
> return "%s %s" %
> ("fileName",data.cast(ptype).dereference()["fileName"])
>
> def display_hint (self):
> return 'string'
>
> I have followed some examples that I found online for building a lookup
> table functions to be called –
>
> def lookup_function (val):
> #print "Look-up and return a pretty-printer that can print val."
>
> # Get the type.
> type = val.type;
> print type
> # If it points to a reference, get the reference.
> if type.code == gdb.TYPE_CODE_REF:
> print "deref"
> type = type.target ()
>
> print type
> # Get the unqualified type, stripped of typedefs.
> type = type.unqualified ().strip_typedefs ()
> print type
>
> # Get the type name.
> typename = type.tag
> print typename
> #print typename
> if typename == None:
> print "None"
> return None
>
> # Iterate over local dictionary of types to determine
> # if a printer is registered for that type. Return an
> # instantiation of the printer if found.
> for function in pretty_printers_dict:
> if function.search (typename):
> print "found"
> return pretty_printers_dict[function] (val)
>
> # Cannot find a pretty printer. Return None.
> print "not found"
> return None
> #
> def build_dictionary ():
> pretty_printers_dict[re.compile ('^QFile$')] = lambda
> val:QFilePrinter(val)
> pretty_printers_dict[re.compile ('^QFile *$')] = lambda
> val:QFilePrinter(val)
>
> pretty_printers_dict = {}
>
> build_dictionary ()
>
> When I debug my code containing a pointer to a QFile object my pretty
> printer is not invoked, but if I type ‘print *f’ (f is a pointer to a QFile
> object) the pretty printer is invoked. Also I add ‘*f’ in the Expressions
> window in Eclipse the printer is invoked.
>
> Is it possible to get my pretty printer to work with pointers in all cases?
>
>