diff options
author | hjk <hjk@qt.io> | 2018-11-09 17:37:14 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2018-11-12 12:31:46 +0000 |
commit | 402991498fb18371b5dc97d9067cbb82d3d1198d (patch) | |
tree | a264f1b0787bc34b1cef37c34aaac44e92f3578e | |
parent | 8fc3452e48991b397966273fbb57850254ea593c (diff) | |
download | qt-creator-402991498fb18371b5dc97d9067cbb82d3d1198d.tar.gz |
Debugger: Fix assignment to QString etc with LLDB
Task-number: QTCREATORBUG-21353
Change-Id: Ie3655738c249240d9fbf17e054fc8f79a284efd4
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r-- | share/qtcreator/debugger/lldbbridge.py | 32 | ||||
-rw-r--r-- | src/plugins/debugger/lldb/lldbengine.cpp | 6 |
2 files changed, 33 insertions, 5 deletions
diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 33acd44176..cd523ed8ff 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -1741,13 +1741,39 @@ class Dumper(DumperBase): value = frame.FindVariable(exp) return value + def setValue(self, address, typename, value): + sbtype = self.lookupNativeType(typename) + error = lldb.SBError() + sbaddr = lldb.SBAddress(address, self.target) + sbvalue = self.target.CreateValueFromAddress('x', sbaddr, sbtype) + sbvalue.SetValueFromCString(str(value), error) + + def setValues(self, address, typename, values): + sbtype = self.lookupNativeType(typename) + sizeof = sbtype.GetByteSize() + error = lldb.SBError() + for i in range(len(values)): + sbaddr = lldb.SBAddress(address + i * sizeof, self.target) + sbvalue = self.target.CreateValueFromAddress('x', sbaddr, sbtype) + sbvalue.SetValueFromCString(str(values[i]), error) + def assignValue(self, args): self.reportToken(args) error = lldb.SBError() - exp = self.hexdecode(args['exp']) + expr = self.hexdecode(args['expr']) value = self.hexdecode(args['value']) - lhs = self.findValueByExpression(exp) - lhs.SetValueFromCString(value, error) + simpleType = int(args['simpleType']) + lhs = self.findValueByExpression(expr) + typeName = lhs.GetType().GetName() + typeName = typeName.replace('::', '__') + pos = typeName.find('<') + if pos != -1: + typeName = typeName[0:pos] + if typeName in self.qqEditable and not simpleType: + expr = self.parseAndEvaluate(expr) + self.qqEditable[typeName](self, expr, value) + else: + lhs.SetValueFromCString(value, error) self.reportResult(self.describeError(error), args) def watchPoint(self, args): diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 124e001b7d..70daef5ac5 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -705,12 +705,14 @@ void LldbEngine::fetchStack(int limit) // ////////////////////////////////////////////////////////////////////// -void LldbEngine::assignValueInDebugger(WatchItem *, +void LldbEngine::assignValueInDebugger(WatchItem *item, const QString &expression, const QVariant &value) { DebuggerCommand cmd("assignValue"); - cmd.arg("exp", toHex(expression)); + cmd.arg("expr", toHex(expression)); cmd.arg("value", toHex(value.toString())); + cmd.arg("type", toHex(item->type)); + cmd.arg("simpleType", isIntOrFloatType(item->type)); cmd.callback = [this](const DebuggerResponse &) { updateLocals(); }; runCommand(cmd); } |