Debugger: Fix assignment to QString etc with LLDB

Task-number: QTCREATORBUG-21353
Change-Id: Ie3655738c249240d9fbf17e054fc8f79a284efd4
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2018-11-09 17:37:14 +01:00
parent 8fc3452e48
commit 402991498f
2 changed files with 33 additions and 5 deletions

View File

@@ -1741,12 +1741,38 @@ class Dumper(DumperBase):
value = frame.FindVariable(exp) value = frame.FindVariable(exp)
return value 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): def assignValue(self, args):
self.reportToken(args) self.reportToken(args)
error = lldb.SBError() error = lldb.SBError()
exp = self.hexdecode(args['exp']) expr = self.hexdecode(args['expr'])
value = self.hexdecode(args['value']) value = self.hexdecode(args['value'])
lhs = self.findValueByExpression(exp) 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) lhs.SetValueFromCString(value, error)
self.reportResult(self.describeError(error), args) self.reportResult(self.describeError(error), args)

View File

@@ -705,12 +705,14 @@ void LldbEngine::fetchStack(int limit)
// //
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
void LldbEngine::assignValueInDebugger(WatchItem *, void LldbEngine::assignValueInDebugger(WatchItem *item,
const QString &expression, const QVariant &value) const QString &expression, const QVariant &value)
{ {
DebuggerCommand cmd("assignValue"); DebuggerCommand cmd("assignValue");
cmd.arg("exp", toHex(expression)); cmd.arg("expr", toHex(expression));
cmd.arg("value", toHex(value.toString())); cmd.arg("value", toHex(value.toString()));
cmd.arg("type", toHex(item->type));
cmd.arg("simpleType", isIntOrFloatType(item->type));
cmd.callback = [this](const DebuggerResponse &) { updateLocals(); }; cmd.callback = [this](const DebuggerResponse &) { updateLocals(); };
runCommand(cmd); runCommand(cmd);
} }