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