From f7d794dc9d723a957e91b2efa0b6786f4c77f095 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 14 Apr 2015 11:24:07 +0200 Subject: [PATCH] Debugger: Next attempt at robust array dumping In the fallback case now really go back to explicit object-at-address construction. LLDB on Linux doesn't seem to like implicit pointer arithmetics. Change-Id: I3be6b0b21b35b9b9141440d4a11e9e889bb2f4bb Reviewed-by: hjk --- share/qtcreator/debugger/dumper.py | 37 ++++++++++++------------------ 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 33c0a44f026..0bf0bd28353 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -963,20 +963,6 @@ class DumperBase: return False - def tryPutArrayContents(self, base, n, innerType): - enc = self.simpleEncoding(innerType) - if not enc: - return False - size = n * innerType.sizeof; - self.put('childtype="%s",' % innerType) - self.put('addrbase="0x%x",' % toInteger(base)) - self.put('addrstep="0x%x",' % toInteger(innerType.sizeof)) - self.put('arrayencoding="%s",' % enc) - self.put('arraydata="') - self.put(self.readMemory(base, size)) - self.put('",') - return True - def putSimpleCharArray(self, base, size = None): if size is None: elided, shown, data = self.readToFirstZero(base, 1, self.displayStringLimit) @@ -1480,17 +1466,24 @@ class DumperBase: displayFormat = self.typeformats.get(needle, AutomaticFormat) return displayFormat - def putArrayData(self, base, n, innerType = None, + def putArrayData(self, base, n, innerType, childNumChild = None, maxNumChild = 10000): - if innerType is None: - innerType = base.dereference().type - if not self.tryPutArrayContents(base, n, innerType): - base = self.createPointerValue(base, innerType) + addrBase = toInteger(base) + innerSize = innerType.sizeof + enc = self.simpleEncoding(innerType) + if enc: + self.put('childtype="%s",' % innerType) + self.put('addrbase="0x%x",' % addrBase) + self.put('addrstep="0x%x",' % innerSize) + self.put('arrayencoding="%s",' % enc) + self.put('arraydata="') + self.put(self.readMemory(addrBase, n * innerSize)) + self.put('",') + else: with Children(self, n, innerType, childNumChild, maxNumChild, - base, innerType.sizeof): + addrBase=addrBase, addrStep=innerSize): for i in self.childRange(): - i = toInteger(i) - self.putSubItem(i, (base + i).dereference()) + self.putSubItem(i, self.createValue(addrBase + i * innerSize, innerType)) def putArrayItem(self, name, addr, n, typeName): with SubItem(self, name):