Eo gdb: Implement eo_data_get to get eo data.

Like 79d76fb25e, this is useful when
debugging a core dump.

It accepts a valid pointer to an object, for example as returned from
$eo_resolve, and a name of a class or mixin, and returns a pointer to
the private data. Essentially the same as efl_data_scope_get(), but also
works on core dumps, and accepts a class name instead of a class
pointer.

Usage:
Print the pointer:
 (gdb) print $eo_data_get($eo_resolve(obj), "Efl_Canvas_Object")
 $1 = (void *) 0x555555eb9290

Use it directly (e.g. to print a value):
 (gdb) print ((Evas_Object_Protected_Data *) $eo_data_get($eo_resolve(obj),
              "Efl_Canvas_Object"))->last_event_type
 $2 = EVAS_CALLBACK_MOUSE_UP

@feature
This commit is contained in:
Tom Hacohen 2016-12-07 12:33:59 +00:00
parent fcef8d8392
commit 5614e46f1f
1 changed files with 49 additions and 0 deletions

View File

@ -93,3 +93,52 @@ class Eo_resolve(gdb.Function):
Eo_resolve()
class Eo_data_get(gdb.Function):
def __init__(self):
gdb.Function.__init__(self, 'eo_data_get')
def invoke(self, ptr, kls_name):
ptr = ptr.cast(null_ptr.type) # Make sure it's the right type
if int(ptr) == 0:
gdb.write('Object is not a valid pointer (NULL).\n')
return null_ptr
kls_name = kls_name.string()
extns = ptr['klass']['mro']
kls = None
i = 0
while int(extns[i]) != 0:
if extns[i]['desc']['name'].string() == kls_name:
kls = extns[i]
i += 1
if kls is None:
gdb.write('Class "{}" not found in the object mro.\n'
.format(kls_name))
return null_ptr
# Check if not mixin
if int(kls['desc']['type']) != 3:
return gdb.parse_and_eval('(void *) (((char *) {}) + {})'
.format(ptr, kls['data_offset']))
else:
extn_off = ptr['klass']['extn_data_off']
if int(extn_off) == 0:
return null_ptr
i = 0
while int(extn_off[i]['klass']) != 0:
kls = extn_off[i]['klass']
if kls['desc']['name'].string() == kls_name:
return gdb.parse_and_eval('(void *) (((char *) {}) + {})'
.format(ptr, kls['data_offset']))
i += 1
return null_ptr
Eo_data_get()