From e98c515c58505c194b685eef4ec2bb1488f7872f Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 31 Aug 2023 18:53:46 -0400 Subject: [PATCH] gdb: Handle the case where the fundamental type table is optimized out Part-of: --- .../libs/gst/helpers/glib_gobject_helper.py | 36 +++++++++++++++---- .../gstreamer/libs/gst/helpers/gst_gdb.py | 9 ++--- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/subprojects/gstreamer/libs/gst/helpers/glib_gobject_helper.py b/subprojects/gstreamer/libs/gst/helpers/glib_gobject_helper.py index f888a11aa2..9cf0581dbf 100644 --- a/subprojects/gstreamer/libs/gst/helpers/glib_gobject_helper.py +++ b/subprojects/gstreamer/libs/gst/helpers/glib_gobject_helper.py @@ -49,29 +49,53 @@ def g_quark_to_string(quark): ## +def is_fundamental(gtype): + gtype = long(gtype) + typenode = gtype - gtype % 4 + + return typenode < (255 << 2) + + def g_type_to_typenode(gtype): def lookup_fundamental_type(typenode): if typenode == 0: return None val = read_global_var("static_fundamental_type_nodes") - if val is None: + if val is None or val.is_optimized_out: return None return val[typenode >> 2].address gtype = long(gtype) typenode = gtype - gtype % 4 - if typenode > (255 << 2): - typenode = gdb.Value(typenode).cast(gdb.lookup_type("TypeNode").pointer()) + if not is_fundamental(gtype): + res = gdb.Value(typenode).cast(gdb.lookup_type("TypeNode").pointer()) else: - typenode = lookup_fundamental_type(typenode) - return typenode + res = lookup_fundamental_type(typenode) + + return res + + +def g_type_fundamental_name(gtype): + if is_fundamental(gtype): + return g_type_to_name(gtype) + else: + typenode = g_type_to_typenode(gtype) + if typenode: + return g_quark_to_string(typenode["qname"]) + return None + + return g_type_to_name(typenode["supers"][int(typenode["n_supers"])]) def g_type_to_name(gtype): typenode = g_type_to_typenode(gtype) if typenode: return g_quark_to_string(typenode["qname"]) - return None + + try: + return gdb.parse_and_eval(f"g_type_name({gtype})").string() + except Exception: + return None def g_type_name_from_instance(instance): diff --git a/subprojects/gstreamer/libs/gst/helpers/gst_gdb.py b/subprojects/gstreamer/libs/gst/helpers/gst_gdb.py index a98476af39..9c0e35a10f 100644 --- a/subprojects/gstreamer/libs/gst/helpers/gst_gdb.py +++ b/subprojects/gstreamer/libs/gst/helpers/gst_gdb.py @@ -23,7 +23,7 @@ import sys import re from glib_gobject_helper import g_type_to_name, g_type_name_from_instance, \ - g_type_to_typenode, g_quark_to_string + g_type_to_typenode, g_quark_to_string, g_type_fundamental_name if sys.version_info[0] >= 3: long = int @@ -214,11 +214,8 @@ def _g_array_iter(array, element_type): def _g_value_get_value(val): - typenode = g_type_to_typenode(val["g_type"]) - if not typenode: - return None - tname = g_quark_to_string(typenode["qname"]) - fname = g_type_to_name(typenode["supers"][int(typenode["n_supers"])]) + tname = g_type_to_name(val["g_type"]) + fname = g_type_fundamental_name(val["g_type"]) if fname in ("gchar", "guchar", "gboolean", "gint", "guint", "glong", "gulong", "gint64", "guint64", "gfloat", "gdouble", "gpointer", "GFlags"):