From a50f1baf5dee2c42f9e44d3c42acd834e4f0d81e Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 7 Sep 2020 14:00:09 +0200 Subject: [PATCH] Debugger: Change LLDB value creation hack ... to something that works with LLDB 12. Task-number: QTCREATORBUG-24596 Change-Id: Ib2f8255d45a02fa3d2c737864994397f587e9b15 Reviewed-by: Christian Stenger Reviewed-by: Eike Ziller --- share/qtcreator/debugger/lldbbridge.py | 23 ++++++++++++++--------- tests/auto/debugger/tst_dumpers.cpp | 1 + 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 31d180898a9..13ad3d3e9ed 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -121,6 +121,8 @@ class Dumper(DumperBase): self.process = None self.target = None + self.fakeAddress_ = None + self.fakeLAddress_ = None self.eventState = lldb.eStateInvalid self.executable_ = None @@ -258,10 +260,15 @@ class Dumper(DumperBase): return align def listMembers(self, value, nativeType): - #DumperBase.warn("ADDR: 0x%x" % self.fakeAddress) - fakeAddress = self.fakeAddress if value.laddress is None else value.laddress - sbaddr = lldb.SBAddress(fakeAddress, self.target) - fakeValue = self.target.CreateValueFromAddress('x', sbaddr, nativeType) + #DumperBase.warn("ADDR: 0x%x" % self.fakeAddress_) + if value.laddress: + fakeAddress = lldb.SBAddress(value.laddress, self.target) + fakeLAddress = value.laddress + else: + fakeAddress = self.fakeAddress_ + fakeLAddress = self.fakeLAddress_ + + fakeValue = self.target.CreateValueFromAddress('x', fakeAddress, nativeType) fakeValue.SetPreferSyntheticValue(False) baseNames = {} @@ -304,7 +311,7 @@ class Dumper(DumperBase): fieldName = '#%s' % anonNumber fakeMember = fakeValue.GetChildAtIndex(i) fakeMemberAddress = fakeMember.GetLoadAddress() - offset = fakeMemberAddress - fakeAddress + offset = fakeMemberAddress - fakeLAddress yield self.Field(self, name=fieldName, type=self.fromNativeType(nativeFieldType), bitsize=fieldBitsize, bitpos=8 * offset) @@ -1228,10 +1235,6 @@ class Dumper(DumperBase): if not self.partialVariable: self.resetPerStepCaches() - anyModule = self.target.GetModuleAtIndex(0) - anySymbol = anyModule.GetSymbolAtIndex(0) - self.fakeAddress = int(anySymbol.GetStartAddress()) - frame = self.currentFrame() if frame is None: self.reportResult('error="No frame"', args) @@ -1968,6 +1971,8 @@ class Tester(Dumper): if line != 0: self.report = savedReport self.process.SetSelectedThread(stoppedThread) + self.fakeAddress_ = frame.GetPC() + self.fakeLAddress_ = frame.GetPCAddress() self.fetchVariables(args) #self.describeLocation(frame) self.report('@NS@%s@' % self.qtNamespace()) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 3646f9eaac4..86b08d7f265 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -1215,6 +1215,7 @@ void tst_Dumpers::initTestCase() m_debuggerVersion = ba.toInt(); if (!m_debuggerVersion) { if (output.startsWith("lldb version")) { + output = output.split('\n')[0]; // drop clang/llvm version int pos1 = output.indexOf('.', 13); int major = output.mid(13, pos1++ - 13).toInt(); int pos2 = output.indexOf(' ', pos1);