diff options
author | hjk <hjk121@nokiamail.com> | 2014-11-26 18:10:14 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-11-28 14:55:03 +0100 |
commit | bf9a3b2020b033e8dc303fcb2b810d3b0051db25 (patch) | |
tree | f11034f51ca182ec6a2aeb8dda315c03dc46aa04 | |
parent | 55a6050f37ad1ad60380782e87441d5467c569a1 (diff) |
Debugger: Fix LLDB reference display for LLDB 320.x
There is seemingly still no proper API for that, and
the old hack broke. Use a new one.
Change-Id: I9e638ca1fbd84c43c7d31b65e017792d1b6a1e0b
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
-rw-r--r-- | share/qtcreator/debugger/lldbbridge.py | 32 | ||||
-rw-r--r-- | tests/auto/debugger/tst_dumpers.cpp | 14 |
2 files changed, 30 insertions, 16 deletions
diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 933c89b544..6a381f9f81 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -920,7 +920,6 @@ class Dumper(DumperBase): return False def putItem(self, value, tryDynamic=True): - #value = value.GetDynamicValue(lldb.eDynamicCanRunTarget) typeName = value.GetType().GetUnqualifiedType().GetName() if self.isGoodLldb: value.SetPreferDynamicValue(tryDynamic) @@ -965,10 +964,11 @@ class Dumper(DumperBase): realType = value.GetType() if hasattr(realType, 'GetCanonicalType'): baseType = realType.GetCanonicalType() - baseValue = value.Cast(baseType.unqualified()) - self.putItem(baseValue) - self.putBetterType(realType) - return + if baseType != realType: + baseValue = value.Cast(baseType.unqualified()) + self.putItem(baseValue) + self.putBetterType(realType) + return # Our turf now. if self.isGoodLldb: @@ -986,11 +986,24 @@ class Dumper(DumperBase): # References if value.GetType().IsReferenceType(): - origType = value.GetTypeName(); type = value.GetType().GetDereferencedType().unqualified() - addr = value.GetLoadAddress() - self.putItem(value.CreateValueFromAddress(None, addr, type)) - self.putBetterType(origType) + addr = value.GetValueAsUnsigned() + #warn("FROM: %s" % value) + #warn("ADDR: 0x%x" % addr) + #warn("TYPE: %s" % type) + # Works: + #item = self.currentThread().GetSelectedFrame().EvaluateExpression( + # "(%s*)0x%x" % (type, addr)).Dereference() + # Works: + item = value.CreateValueFromExpression(None, + "(%s*)0x%x" % (type, addr), lldb.SBExpressionOptions()).Dereference() + # Does not work: + #item = value.CreateValueFromAddress(None, addr, type) + # Does not work: + #item = value.Cast(type.GetPointerType()).Dereference() + #warn("TOOO: %s" % item) + self.putItem(item) + self.putBetterType(value.GetTypeName()) return # Pointers @@ -1534,7 +1547,6 @@ class Dumper(DumperBase): def selectThread(self, args): self.process.SetSelectedThreadByID(args['id']) self.reportData() - self.reportStack() def requestModuleSymbols(self, frame): self.handleCommand("target module list " + frame) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 9d55438e21..059d388080 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -1441,7 +1441,10 @@ void tst_Dumpers::dumper_data() "public:\n" " Foo(int i = 0)\n" " : a(i), b(2)\n" - " {}\n" + " {\n" + " for (int j = 0; j < 6; ++j)\n" + " x[j] = 'a' + j;\n" + " }\n" " virtual ~Foo()\n" " {\n" " a = 5;\n" @@ -4845,12 +4848,12 @@ void tst_Dumpers::dumper_data() QTest::newRow("Reference") - << Data(fooData + - "#include <string>\n" + << Data("#include <string>\n" "#include <QString>\n" "using namespace std;\n" - "string fooxx() { return \"bababa\"; }\n", + "string fooxx() { return \"bababa\"; }\n" + + fooData, "int a1 = 43;\n" "const int &b1 = a1;\n" @@ -4888,7 +4891,7 @@ void tst_Dumpers::dumper_data() + Check("a2", "\"hello\"", "std::string") + Check("b2", "\"bababa\"", Pattern("(std::)?string &")) // Clang... + Check("c2", "\"world\"", "std::string") - + Check("d2", "\"hello\"", "Ref2") + + Check("d2", "\"hello\"", "Ref2") % NoLldbEngine + Check("a3", "\"hello\"", "@QString") + Check("b3", "\"hello\"", "@QString &") @@ -4901,7 +4904,6 @@ void tst_Dumpers::dumper_data() //+ Check("d4", "\"hello\"", "Ref4"); FIXME: We get "Foo &" instead + Check("d4.a", "12", "int"); - QTest::newRow("DynamicReference") << Data("struct BaseClass { virtual ~BaseClass() {} };\n" "struct DerivedClass : BaseClass {};\n", |