From 7492b67e65b48a7835c5fee671b181803a7e5896 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Wed, 7 Dec 2016 12:33:59 +0000 Subject: Eo gdb: Implement eo_data_get to get eo data. Like 79d76fb25ece4ffbf5785b4be2b030f062ef9f2c, 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 --- data/eo/eo_gdb.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'data/eo/eo_gdb.py') diff --git a/data/eo/eo_gdb.py b/data/eo/eo_gdb.py index e54797d68e..6a58a6c507 100644 --- a/data/eo/eo_gdb.py +++ b/data/eo/eo_gdb.py @@ -81,3 +81,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() -- cgit v1.2.1