Debugger: Speed up QObject recognition

Change-Id: Ib9847725c1e97ad774173ecb95094791ff5d1bbc
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2024-04-26 17:42:50 +02:00
parent 8cf1247d5f
commit 3697aac20e
3 changed files with 46 additions and 3 deletions

View File

@@ -491,7 +491,7 @@ class DumperBase():
self.type_alignment_cache[typeid] = self.type_alignment_cache[target_typeid]
return typeid
def register_struct(self, name, p5=0, p6=0, s=0):
def register_struct(self, name, p5=0, p6=0, s=0, qobject_based=False):
# p5 = n -> n * ptrsize for Qt 5
# p6 = n -> n * ptrsize for Qt 6
#if self.qtVersion() >= 0x060000: # FIXME: Qt 5, ptrSize()
@@ -499,6 +499,7 @@ class DumperBase():
typeid = self.typeid_for_string(name)
self.type_code_cache[typeid] = TypeCode.Struct
self.type_size_cache[typeid] = size
self.type_qobject_based_cache[typeid] = qobject_based
self.type_alignment_cache[typeid] = 8
return typeid
@@ -562,7 +563,7 @@ class DumperBase():
self.register_enum('@Qt::ItemDataRole', 4)
self.register_struct('@QObject', p5=2, p6=2)
self.register_struct('@QObject', p5=2, p6=2, qobject_based=True)
self.register_struct('@QObjectPrivate', p5=10, p6=10) # FIXME: Not exact
self.register_struct('@QByteArray', p5=1, p6=3)
@@ -1580,6 +1581,12 @@ class DumperBase():
pass
def putQObjectNameValue(self, value):
is_qobject_based = self.type_qobject_based_cache.get(value.typeid, None)
if is_qobject_based == False:
#self.warn("SKIP TEST OBJNAME: %s" % self.type_name(value.typeid))
return
#self.warn("TEST OBJNAME: %s" % self.type_name(value.typeid))
self.fetchInternalFunctions()
try:
@@ -3253,6 +3260,7 @@ typename))
self.type_nativetype_cache = {}
self.type_modulename_cache = {}
self.type_encoding_cache = {}
self.type_qobject_based_cache = {}
self.typeid_cache = {} # internal typename -> id
self.typeid_current = 100
self.typeid_from_typekey = {} # typename -> id

View File

@@ -380,6 +380,18 @@ class Dumper(DumperBase):
self.type_nativetype_cache[typeid] = nativeType
if code == gdb.TYPE_CODE_STRUCT:
self.type_qobject_based_cache[typeid] = self.is_qobject_based(nativeType)
#res = self.is_qobject_based(nativeType)
#if res == False:
# self.warn("RECOGNIZED AS NON-QOBJECT: %s" % nativeType)
#elif res == True:
# self.warn("RECOGNIZED AS QOBJECT: %s" % nativeType)
#else:
# self.warn("UNRECOGNIZED: %s" % nativeType)
elif code != gdb.TYPE_CODE_TYPEDEF:
self.type_qobject_based_cache[typeid] = False
# FIXME: Field offset caching (or later extraction?) broken
# if code == gdb.TYPE_CODE_STRUCT:
# field_type_name = self.type_name_cache.get(typeid, '')
@@ -413,6 +425,16 @@ class Dumper(DumperBase):
return typeid
def is_qobject_based(self, nativeType):
if str(nativeType) == self.qtNamespace() + 'QObject':
return True
fields = nativeType.fields()
if len(fields) == 0:
return None # No info, can't drill deeper
if not fields[0].is_base_class:
return False
return self.is_qobject_based(fields[0].type)
def nativeTemplateParameter(self, typeid, index, nativeType):
try:
targ = nativeType.template_argument(index)

View File

@@ -338,6 +338,15 @@ class Dumper(DumperBase):
self.ptrSize = lambda: result
return result
def is_qobject_based(self, nativeType):
if nativeType.GetName() == self.qtNamespace() + 'QObject':
return True
if nativeType.GetNumberOfDirectBaseClasses() > 0:
return self.is_qobject_based(nativeType.GetDirectBaseClassAtIndex(0).GetType())
if nativeType.GetNumberOfFields() > 0:
return False
return None # No info, can't drill deeper
def from_native_type(self, nativeType):
self.check(isinstance(nativeType, lldb.SBType))
@@ -458,8 +467,12 @@ class Dumper(DumperBase):
self.nativeTypeEnumDisplay(nativeType, intval, form)
elif code in (lldb.eTypeClassComplexInteger, lldb.eTypeClassComplexFloat):
type_code = TypeCode.Complex
elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct, lldb.eTypeClassUnion):
elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct):
type_code = TypeCode.Struct
self.type_qobject_based_cache[typeid] = self.is_qobject_based(nativeType)
elif code == lldb.eTypeClassUnion:
type_code = TypeCode.Struct
self.type_qobject_based_cache[typeid] = False
elif code == lldb.eTypeClassFunction:
type_code = TypeCode.Function
elif code == lldb.eTypeClassMemberPointer: