summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2018-11-09 17:37:14 +0100
committerhjk <hjk@qt.io>2018-11-12 12:31:46 +0000
commit402991498fb18371b5dc97d9067cbb82d3d1198d (patch)
treea264f1b0787bc34b1cef37c34aaac44e92f3578e
parent8fc3452e48991b397966273fbb57850254ea593c (diff)
downloadqt-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.py32
-rw-r--r--src/plugins/debugger/lldb/lldbengine.cpp6
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);
}