Debugger: Adapt QObject name dumper to Qt 6

Task-number: QTCREATORBUG-24098
Change-Id: Iee8a71eda4c15b3cd36e569805fef769f6eb090f
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2020-11-25 17:18:24 +01:00
parent 448cdb7bb5
commit 398a74b027
2 changed files with 39 additions and 20 deletions

View File

@@ -572,6 +572,13 @@ class DumperBase():
return data, size, alloc return data, size, alloc
def qArrayData(self, value): def qArrayData(self, value):
if self.qtVersion() >= 0x60000:
dd, data, size = self.split('ppi', value)
if dd:
alloc, i, i = self.split('Pii', dd)
else: # fromRawData
alloc = size
return data, size, alloc
return self.qArrayDataHelper(self.extractPointer(value)) return self.qArrayDataHelper(self.extractPointer(value))
def qArrayDataHelper(self, array_data_ptr): def qArrayDataHelper(self, array_data_ptr):
@@ -701,14 +708,6 @@ class DumperBase():
return self.encodedUtf16ToUtf8(self.encodeString(value, limit)) return self.encodedUtf16ToUtf8(self.encodeString(value, limit))
def stringData(self, value): # -> (data, size, alloc) def stringData(self, value): # -> (data, size, alloc)
if self.qtVersion() >= 0x60000:
dd, data, size = value.split('ppi')
if dd:
alloc, i, i = self.split('Pii', dd)
else: # fromRawData
alloc = size
return data, size, alloc
else:
return self.qArrayData(value) return self.qArrayData(value)
def extractTemplateArgument(self, typename, position): def extractTemplateArgument(self, typename, position):
@@ -1442,22 +1441,27 @@ class DumperBase():
intSize = 4 intSize = 4
ptrSize = self.ptrSize() ptrSize = self.ptrSize()
if self.qtVersion() < 0x050000: if self.qtVersion() >= 0x060000:
# Size of QObjectData: 5 pointer + 2 int # Size of QObjectData: 7 pointer + 2 int
# - vtable # - vtable
# - QObject *q_ptr; # - QObject *q_ptr;
# - QObject *parent; # - QObject *parent;
# - QObjectList children; # - QObjectList children;
# - uint isWidget : 1; etc.. # - uint isWidget : 1; etc...
# - int postedEvents; # - int postedEvents;
# - QMetaObject *metaObject; # - QDynamicMetaObjectData *metaObject;
extra = self.extractPointer(dd + 7 * ptrSize + 2 * intSize)
if extra == 0:
return False
# Offset of objectName in QObjectPrivate: 5 pointer + 2 int # Offset of objectName in ExtraData: 12 pointer
# - [QObjectData base] # - QList<QByteArray> propertyNames;
# - QList<QVariant> propertyValues;
# - QVector<int> runningTimers;
# - QList<QPointer<QObject> > eventFilters;
# - QString objectName # - QString objectName
objectNameAddress = dd + 5 * ptrSize + 2 * intSize objectNameAddress = extra + 12 * ptrSize
elif self.qtVersion() >= 0x050000:
else:
# Size of QObjectData: 5 pointer + 2 int # Size of QObjectData: 5 pointer + 2 int
# - vtable # - vtable
# - QObject *q_ptr; # - QObject *q_ptr;
@@ -1478,6 +1482,21 @@ class DumperBase():
# - QList<QPointer<QObject> > eventFilters; # - QList<QPointer<QObject> > eventFilters;
# - QString objectName # - QString objectName
objectNameAddress = extra + 5 * ptrSize objectNameAddress = extra + 5 * ptrSize
else:
# Size of QObjectData: 5 pointer + 2 int
# - vtable
# - QObject *q_ptr;
# - QObject *parent;
# - QObjectList children;
# - uint isWidget : 1; etc..
# - int postedEvents;
# - QMetaObject *metaObject;
# Offset of objectName in QObjectPrivate: 5 pointer + 2 int
# - [QObjectData base]
# - QString objectName
objectNameAddress = dd + 5 * ptrSize + 2 * intSize
data, size, alloc = self.qArrayData(objectNameAddress) data, size, alloc = self.qArrayData(objectNameAddress)

View File

@@ -1047,9 +1047,9 @@ class Dumper(DumperBase):
def handleNewObjectFile(self, objfile): def handleNewObjectFile(self, objfile):
name = objfile.filename name = objfile.filename
if self.isWindowsTarget(): if self.isWindowsTarget():
qtCoreMatch = re.match(r'.*Qt5?Core[^/.]*d?\.dll', name) qtCoreMatch = re.match(r'.*Qt[56]?Core[^/.]*d?\.dll', name)
else: else:
qtCoreMatch = re.match(r'.*/libQt5?Core[^/.]*\.so', name) qtCoreMatch = re.match(r'.*/libQt[56]?Core[^/.]*\.so', name)
if qtCoreMatch is not None: if qtCoreMatch is not None:
self.addDebugLibs(objfile) self.addDebugLibs(objfile)