Python API - pretty printing complex types

Joachim Protze joachim.protze@wh2.tu-dresden.de
Wed Mar 9 08:06:00 GMT 2011


My first approach makes use of the undocumented (online-doc) 
array-method of gdb.Type, that i put in a handy function -- the straight 
forward way.
For the second approach you have to put a typedef into your source -- 
the more flexible way for complex situations.

On 09.03.2011 01:46, Andrew Oakley wrote:
> struct value_type { ... };
>
> struct container {
>          int interesting_field1;
>          int interesting_field2;
>
>          size_t values_length1;
>          struct value_type * values1;
>
>          size_t values_length2;
>          struct value_type * values2;
> };
>
def cast_pointer_to_array(pointer, length):
     return 
pointer.cast(pointer.dereference().type.array(length-1).pointer()).dereference()

class container_printer:
     [...]
     def children(self):
         yield ("interesting_field1", self.val["interesting_field1"])
         yield ("interesting_field2", self.val["interesting_field2"])
         yield ("members1", cast_pointer_to_array(self.val["values1"], 
self.val["values_length1"])
         yield ("members2", cast_pointer_to_array(self.val["values2"], 
self.val["values_length2"])

     def display_hint (self):
         return "struct"

This way you get 2 Arrays of member-values
> Ideally my pretty printer would output something like this:
>
> container = {
>    interesting_field1 = 42,
>    interesting_field2 = 0,
>    members = {
>          { value1 },
>          { value2 },
>          { value3 }
>    }
> }
>
To get one single array use the second approach:


typedef struct container container_helper_type;

class container_printer:
     [...]
     def children(self):
         yield ("interesting_field1", self.val["interesting_field1"])
         yield ("interesting_field2", self.val["interesting_field2"])
         yield ("members", 
self.val.cast(gdb.lookup_type("container_helper_type")))

     def display_hint (self):
         return "struct"

class container_helper_type_printer:
     [...]
     def children(self):
         for i in range(self.val["values_length1"]):
             yield ("", self.val["values1"][i])
         for i in range(self.val["values_length2"]):
             yield ("", self.val["values2"][i])

     def display_hint (self):
         return "array"



More information about the Gdb mailing list