gdb: Handle the case where the fundamental type table is optimized out

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5986>
This commit is contained in:
Thibault Saunier 2023-08-31 18:53:46 -04:00 committed by GStreamer Marge Bot
parent f1070b4380
commit e98c515c58
2 changed files with 33 additions and 12 deletions

View file

@ -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):

View file

@ -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"):