diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 8955c09612a4853ab942ac0c673e60232aebd252..2d0df4275a4681a011c60d27318f1bac19eaf206 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -1215,7 +1215,14 @@ class Dumper(DumperBase): return toInteger(value.address) def createPointerValue(self, address, pointeeType): - return gdb.Value(address).cast(pointeeType.pointer()) + # This might not always work: + # a Python 3 based GDB due to the bug addressed in + # https://sourceware.org/ml/gdb-patches/2013-09/msg00571.html + try: + return gdb.Value(address).cast(pointeeType.pointer()) + except: + # Try _some_ fallback (good enough for the std::complex dumper) + return gdb.parse_and_eval("(%s*)%s" % (pointeeType, address)) def intSize(self): return 4 @@ -1227,7 +1234,11 @@ class Dumper(DumperBase): return self.lookupType('void*').sizeof == 4 def createValue(self, address, referencedType): - return gdb.Value(address).cast(referencedType.pointer()).dereference() + try: + return gdb.Value(address).cast(referencedType.pointer()).dereference() + except: + # Try _some_ fallback (good enough for the std::complex dumper) + return gdb.parse_and_eval("{%s}%s" % (referencedType, address)) def readRawMemory(self, addr, size): mem = gdb.selected_inferior().read_memory(addr, size) diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 428373ad3204a3d216314090717d1e26fb8e95b3..4ca65badb0f234f321b631c7d4a9aead5bfcdd61 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -79,9 +79,8 @@ def qdump__std____1__array(d, value): def qdump__std__complex(d, value): innerType = d.templateArgument(value.type, 0) - base = value.address.cast(innerType.pointer()) - real = base.dereference() - imag = (base + 1).dereference() + real = value.cast(innerType) + imag = d.createValue(d.addressOf(value) + innerType.sizeof, innerType) d.putValue("(%f, %f)" % (real, imag)); d.putNumChild(2) if d.isExpanded(): diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index fba59c77c93c3236e7000ec60bee804fd3de9f5e..7b08bb3514cc4dbdb709f727eae6e2afcffd6077 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -2469,8 +2469,10 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdComplex") << Data("#include <complex>\n", - "std::complex<double> c(1, 2);\n") - % Check("c", "(1.000000, 2.000000)", "std::complex<double>"); + "std::complex<double> c(1, 2);\n" + "unused(&c);\n") + % Check("c", "(1.000000, 2.000000)", "std::complex<double>") + % CheckType("c.real", "double"); QTest::newRow("CComplexGdb") << Data("#include <complex.h>\n",