diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index d78a535ccee983ad6fbd62cc3c640d8eb6dcc829..f904be8c79f96c29f88c6a62bd63cc61d52afcb6 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -118,9 +118,6 @@ class Blob(object): def extractFloat(self, offset = 0): return struct.unpack_from("f", self.data, offset)[0] - def extractPointer(self, offset = 0): - return struct.unpack_from("P", self.data, offset)[0] - # # Gnuplot based display for array-like structures. # @@ -383,7 +380,7 @@ class DumperBase: # - qptrdiff offset size = self.extractInt(addr + 4) alloc = self.extractInt(addr + 8) & 0x7ffffff - data = addr + self.dereference(addr + 8 + self.ptrSize()) + data = addr + self.extractPointer(addr + 8 + self.ptrSize()) if self.ptrSize() == 4: data = data & 0xffffffff else: @@ -396,7 +393,7 @@ class DumperBase: # - char *data; alloc = self.extractInt(addr + 4) size = self.extractInt(addr + 8) - data = self.dereference(addr + 8 + self.ptrSize()) + data = self.extractPointer(addr + 8 + self.ptrSize()) return data, size, alloc # addr is the begin of a QByteArrayData structure @@ -429,27 +426,27 @@ class DumperBase: return self.hexencode(data) def encodeByteArray(self, value): - return self.encodeByteArrayHelper(self.dereferenceValue(value)) + return self.encodeByteArrayHelper(self.extractPointer(value)) def byteArrayData(self, value): - return self.byteArrayDataHelper(self.dereferenceValue(value)) + return self.byteArrayDataHelper(self.extractPointer(value)) def putByteArrayValue(self, value): return self.putValue(self.encodeByteArray(value), Hex2EncodedLatin1) def putByteArrayValueByAddress(self, addr): - self.putValue(self.encodeByteArrayHelper(self.dereference(addr)), + self.putValue(self.encodeByteArrayHelper(self.extractPointer(addr)), Hex2EncodedLatin1) def putStringValueByAddress(self, addr): - self.putValue(self.encodeStringHelper(self.dereference(addr)), + self.putValue(self.encodeStringHelper(self.extractPointer(addr)), Hex4EncodedLittleEndian) def encodeString(self, value): - return self.encodeStringHelper(self.dereferenceValue(value)) + return self.encodeStringHelper(self.extractPointer(value)) def stringData(self, value): - return self.byteArrayDataHelper(self.dereferenceValue(value)) + return self.byteArrayDataHelper(self.extractPointer(value)) def extractTemplateArgument(self, typename, position): level = 0 @@ -859,7 +856,7 @@ class DumperBase: intSize = self.intSize() ptrSize = self.ptrSize() # dd = value["d_ptr"]["d"] is just behind the vtable. - dd = self.dereference(self.addressOf(value) + ptrSize) + dd = self.extractPointer(value, offset=ptrSize) if self.qtVersion() < 0x050000: # Size of QObjectData: 5 pointer + 2 int @@ -915,8 +912,8 @@ class DumperBase: def staticQObjectPropertyNames(self, metaobject): properties = [] dd = metaobject["d"] - data = self.dereferenceValue(dd["data"]) - sd = self.dereferenceValue(dd["stringdata"]) + data = self.extractPointer(dd["data"]) + sd = self.extractPointer(dd["stringdata"]) metaObjectVersion = self.extractInt(data) propertyCount = self.extractInt(data + 24) @@ -1027,6 +1024,18 @@ class DumperBase: base += 1 f.write("e\n") + def extractPointer(self, thing, offset = 0): + if isinstance(thing, int): + bytes = self.extractBlob(thing, self.ptrSize()).toBytes() + elif sys.version_info[0] == 2 and isinstance(thing, long): + bytes = self.extractBlob(thing, self.ptrSize()).toBytes() + elif isinstance(thing, Blob): + bytes = blob.toBytes() + else: + # Assume it's a (backend specific) Value. + bytes = self.toBlob(thing).toBytes() + code = "I" if self.ptrSize() == 4 else "Q" + return struct.unpack_from(code, bytes, offset)[0] # Some "Enums" diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 797144010cf6e5e8169f5344af9ba67aaecc404a..d6633004082f31050fb36dd1af18416ebe7a184d 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -947,15 +947,6 @@ class Dumper(DumperBase): mem.tobytes() return mem - # FIXME: The commented out versions do not work with - # a Python 3 based GDB due to the bug addressed in - # https://sourceware.org/ml/gdb-patches/2013-09/msg00571.html - def dereference(self, addr): - #return long(gdb.Value(addr).cast(self.voidPtrType().pointer()).dereference()) - ptrSize = self.ptrSize() - code = "I" if ptrSize == 4 else "Q" - return struct.unpack(code, self.readRawMemory(addr, ptrSize))[0] - def extractInt64(self, addr): return struct.unpack("q", self.readRawMemory(addr, 8))[0] @@ -965,11 +956,6 @@ class Dumper(DumperBase): def extractByte(self, addr): return struct.unpack("b", self.readRawMemory(addr, 1))[0] - # Do not use value.address here as this might not have one, - # i.e. be the result of an inferior call - def dereferenceValue(self, value): - return toInteger(value.cast(self.voidPtrType())) - def extractStaticMetaObjectHelper(self, typeobj): """ Checks whether type has a Q_OBJECT macro. diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 6dd3ab1b6e532c5a69d3437556e5ac0590de1f3e..20769eb10d77604ccd9d604a4cf54e03dce87d3f 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -541,12 +541,6 @@ class Dumper(DumperBase): def addressOf(self, value): return int(value.GetLoadAddress()) - def dereferenceValue(self, value): - return long(value.Cast(self.voidPtrType())) - - def dereference(self, address): - return long(self.createValue(address, self.voidPtrType())) - def extractInt(self, address): return int(self.createValue(address, self.intType())) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index f4be9300945b238b570411b6cdea58e5b619284e..e9173dc4d676ab013a9ff157e9ef2cf0904a3a12 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -230,7 +230,7 @@ def qdump__QTime(d, value): def qdump__QTimeZone(d, value): - base = d.dereferenceValue(value) + base = d.extractPointer(value) if base == 0: d.putValue("(null)") d.putNumChild(0) @@ -245,7 +245,7 @@ def qdump__QDateTime(d, value): isValid = False # This relies on the Qt4/Qt5 internal structure layout: # {sharedref(4), ... - base = d.dereferenceValue(value) + base = d.extractPointer(value) if qtVersion >= 0x050200: dateBase = base + d.ptrSize() # Only QAtomicInt, but will be padded. # qint64 m_msecs @@ -312,7 +312,7 @@ def qdump__QDateTime(d, value): def qdump__QDir(d, value): d.putNumChild(1) - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) bit32 = d.is32bit() qt5 = d.qtVersion() >= 0x050000 @@ -415,7 +415,7 @@ def qdump__QFile(d, value): def qdump__QFileInfo(d, value): - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) #bit32 = d.is32bit() #qt5 = d.qtVersion() >= 0x050000 #try: @@ -676,7 +676,7 @@ def qdump__QHostAddress(d, value): # protocol (2*ptrSize + 20) # bool isParsed (2*ptrSize + 24) - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) isQt5 = d.qtVersion() >= 0x050000 sizeofQString = d.ptrSize() ipStringAddress = privAddress + (0 if isQt5 else 24) @@ -841,7 +841,7 @@ def qdump__QImage(d, value): def qdump__QLinkedList(d, value): - dd = d.dereferenceValue(value) + dd = d.extractPointer(value) ptrSize = d.ptrSize() n = d.extractInt(dd + 4 + 2 * ptrSize); ref = d.extractInt(dd + 2 * ptrSize); @@ -1058,7 +1058,7 @@ def qdump__QMetaObject(d, value): with Children(d): dd = value["d"] d.putSubItem("d", dd) - data = d.dereferenceValue(dd["data"]) + data = d.extractPointer(dd["data"]) propertyNames = d.staticQObjectPropertyNames(value) propertyIndex = 0 @@ -1069,7 +1069,7 @@ def qdump__QMetaObject(d, value): #byteArrayDataType = d.lookupType(d.qtNamespace() + "QByteArrayData") #byteArrayDataSize = byteArrayDataType.sizeof - #sd = d.dereferenceValue(dd["stringdata"]) + #sd = d.extractPointer(dd["stringdata"]) #stringdata, size, alloc = d.byteArrayDataHelper(sd) #propertyCount = d.extractInt(data + 24) @@ -1552,7 +1552,7 @@ def qdump__QRectF(d, value): def qdump__QRegExp(d, value): # value.priv.engineKey.pattern - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) engineKeyAddress = privAddress + d.ptrSize() patternAddress = engineKeyAddress d.putStringValueByAddress(patternAddress) @@ -1595,7 +1595,7 @@ def qdump__QRegion(d, value): # QRect extents; # QRect innerRect; # int innerArea; - pp = d.dereferenceValue(p) + pp = d.extractPointer(p) n = d.extractInt(pp) d.putItemCount(n) d.putNumChild(n) @@ -1792,7 +1792,7 @@ def qdump__QTextCodec(d, value): def qdump__QTextCursor(d, value): - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) if privAddress == 0: d.putValue("(invalid)") d.putNumChild(0) @@ -1822,7 +1822,7 @@ def qdump__QTextDocument(d, value): def qdump__QUrl(d, value): if d.qtVersion() < 0x050000: - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) if not privAddress: # d == 0 if QUrl was constructed with default constructor d.putValue("<invalid>") @@ -1854,7 +1854,7 @@ def qdump__QUrl(d, value): # - QString path; # - QString query; # - QString fragment; - privAddress = d.dereferenceValue(value) + privAddress = d.extractPointer(value) if not privAddress: # d == 0 if QUrl was constructed with default constructor d.putValue("<invalid>") @@ -1867,7 +1867,7 @@ def qdump__QUrl(d, value): path = d.encodeStringHelper(d.dereference(schemeAddr + 4 * d.ptrSize())) query = d.encodeStringHelper(d.dereference(schemeAddr + 5 * d.ptrSize())) fragment = d.encodeStringHelper(d.dereference(schemeAddr + 6 * d.ptrSize())) - port = d.extractInt(d.dereferenceValue(value) + d.intSize()) + port = d.extractInt(d.extractPointer(value) + d.intSize()) url = scheme url += "3a002f002f00" @@ -1967,7 +1967,7 @@ qdumpHelper_QVariants_B = [ def qdumpHelper_QVariant_31(d, blob): # QVariant::VoidStar d.putBetterType("%sQVariant (void *)" % d.qtNamespace()) - d.putValue("0x%x" % blob.extractPointer()) + d.putValue("0x%x" % d.extractPointer(blob)) def qdumpHelper_QVariant_32(d, blob): # QVariant::Long diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 515b01a2449dc879c1e5aba2cf0580e501a2ea52..edff234011291b14fe433355c6a2c7ad3655e999 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -764,7 +764,7 @@ def qdump__std____1__vector(d, value): innerType = d.templateArgument(value.type, 0) if d.isLldb and d.childAt(value, 0).type == innerType: # That's old lldb automatically formatting - begin = d.dereferenceValue(value) + begin = d.extractPointer(value) size = value.GetNumChildren() else: # Normal case