From 398a74b0277135407d563aca103f68d737159d59 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Nov 2020 17:18:24 +0100 Subject: [PATCH] Debugger: Adapt QObject name dumper to Qt 6 Task-number: QTCREATORBUG-24098 Change-Id: Iee8a71eda4c15b3cd36e569805fef769f6eb090f Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 55 ++++++++++++++++++--------- share/qtcreator/debugger/gdbbridge.py | 4 +- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 28c668b699d..b682f4ae002 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -572,6 +572,13 @@ class DumperBase(): return data, size, alloc 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)) def qArrayDataHelper(self, array_data_ptr): @@ -701,14 +708,6 @@ class DumperBase(): return self.encodedUtf16ToUtf8(self.encodeString(value, limit)) 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) def extractTemplateArgument(self, typename, position): @@ -1442,22 +1441,27 @@ class DumperBase(): intSize = 4 ptrSize = self.ptrSize() - if self.qtVersion() < 0x050000: - # Size of QObjectData: 5 pointer + 2 int - # - vtable + if self.qtVersion() >= 0x060000: + # Size of QObjectData: 7 pointer + 2 int + # - vtable # - QObject *q_ptr; # - QObject *parent; # - QObjectList children; - # - uint isWidget : 1; etc.. + # - uint isWidget : 1; etc... # - 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 - # - [QObjectData base] + # Offset of objectName in ExtraData: 12 pointer + # - QList propertyNames; + # - QList propertyValues; + # - QVector runningTimers; + # - QList > eventFilters; # - QString objectName - objectNameAddress = dd + 5 * ptrSize + 2 * intSize - - else: + objectNameAddress = extra + 12 * ptrSize + elif self.qtVersion() >= 0x050000: # Size of QObjectData: 5 pointer + 2 int # - vtable # - QObject *q_ptr; @@ -1478,6 +1482,21 @@ class DumperBase(): # - QList > eventFilters; # - QString objectName 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) diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index f5ee86c3497..eefe6caa764 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -1047,9 +1047,9 @@ class Dumper(DumperBase): def handleNewObjectFile(self, objfile): name = objfile.filename if self.isWindowsTarget(): - qtCoreMatch = re.match(r'.*Qt5?Core[^/.]*d?\.dll', name) + qtCoreMatch = re.match(r'.*Qt[56]?Core[^/.]*d?\.dll', name) else: - qtCoreMatch = re.match(r'.*/libQt5?Core[^/.]*\.so', name) + qtCoreMatch = re.match(r'.*/libQt[56]?Core[^/.]*\.so', name) if qtCoreMatch is not None: self.addDebugLibs(objfile)