Debugger: Prepare assigning of values in LLDB interface

Change-Id: I722e78c352066ddd05e96199fd8ead088e3e9f59
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
hjk
2013-05-30 15:35:52 +02:00
parent a7fa0dd4b9
commit 1dac4ba791
3 changed files with 82 additions and 81 deletions

View File

@@ -164,6 +164,8 @@ void LldbEngine::setupInferior()
{
QString executable = QFileInfo(startParameters().executable).absoluteFilePath();
runCommand(Command("setupInferior").arg("executable", executable));
requestUpdateWatchers();
}
void LldbEngine::runEngine()
@@ -676,18 +678,16 @@ void LldbEngine::updateAll()
//
//////////////////////////////////////////////////////////////////////
void LldbEngine::assignValueInDebugger(const Internal::WatchData *, const QString &expression, const QVariant &value)
void LldbEngine::assignValueInDebugger(const Internal::WatchData *data,
const QString &expression, const QVariant &value)
{
Q_UNUSED(expression);
Q_UNUSED(value);
//SDEBUG("ASSIGNING: " << (expression + QLatin1Char('=') + value.toString()));
#if 0
m_scriptEngine->evaluate(expression + QLatin1Char('=') + value.toString());
updateLocals();
#endif
Q_UNUSED(data);
Command cmd("assignValue");
cmd.arg("exp", expression.toLatin1().toHex());
cmd.arg("value", value.toString().toLatin1().toHex());
runCommand(cmd);
}
void LldbEngine::updateWatchData(const WatchData &data, const WatchUpdateFlags &flags)
{
Q_UNUSED(data);
@@ -699,12 +699,13 @@ void LldbEngine::updateLocals()
{
WatchHandler *handler = watchHandler();
requestUpdateWatchers();
Command cmd("updateData");
cmd.arg("expanded", handler->expansionRequests());
cmd.arg("typeformats", handler->typeFormatRequests());
cmd.arg("formats", handler->individualFormatRequests());
QList<QByteArray> watcherData;
// const QString fileName = stackHandler()->currentFrame().file;
// if (!fileName.isEmpty()) {
// const QString function = stackHandler()->currentFrame().function;
@@ -739,16 +740,6 @@ void LldbEngine::updateLocals()
// }
// }
QHashIterator<QByteArray, int> it(handler->watcherNames());
while (it.hasNext()) {
it.next();
QHash<QByteArray, QByteArray> hash;
hash["exp"] = '\'' + it.key() + '\'';
hash["id"] = "'watch." + QByteArray::number(it.value()) + '\'';
watcherData.append(Command::toData(hash));
}
cmd.args.append("'watchers':" + Command::toData(watcherData) + ',');
const static bool alwaysVerbose = !qgetenv("QTC_DEBUGGER_PYTHON_VERBOSE").isEmpty();
cmd.arg("passexeptions", alwaysVerbose);
cmd.arg("fancy", debuggerCore()->boolSetting(UseDebuggingHelpers));
@@ -839,58 +830,21 @@ void LldbEngine::readLldbStandardOutput()
}
}
QByteArray LldbEngine::currentOptions() const
void LldbEngine::requestUpdateWatchers()
{
QByteArray localsOptions;
QByteArray stackOptions;
QByteArray threadsOptions;
{
QByteArray watchers;
//if (!m_toolTipExpression.isEmpty())
// watchers += m_toolTipExpression.toLatin1()
// + '#' + tooltipINameForExpression(m_toolTipExpression.toLatin1());
WatchHandler *handler = watchHandler();
QHash<QByteArray, int> watcherNames = handler->watcherNames();
QHashIterator<QByteArray, int> it(watcherNames);
while (it.hasNext()) {
it.next();
if (!watchers.isEmpty())
watchers += "##";
watchers += it.key() + "#watch." + QByteArray::number(it.value());
}
QByteArray options;
if (debuggerCore()->boolSetting(UseDebuggingHelpers))
options += "fancy,";
if (debuggerCore()->boolSetting(AutoDerefPointers))
options += "autoderef,";
if (options.isEmpty())
options += "defaults,";
options.chop(1);
localsOptions = "options:" + options + " "
+ "vars: "
+ "expanded:" + handler->expansionRequests() + " "
+ "typeformats:" + handler->typeFormatRequests() + " "
+ "formats:" + handler->individualFormatRequests() + " "
+ "watcher:" + watchers.toHex();
WatchHandler *handler = watchHandler();
QHashIterator<QByteArray, int> it(handler->watcherNames());
QList<QByteArray> watcherData;
while (it.hasNext()) {
it.next();
QHash<QByteArray, QByteArray> hash;
hash["iname"] = "'watch." + QByteArray::number(it.value()) + '\'';
hash["exp"] = '\'' + it.key().toHex() + '\'';
watcherData.append(Command::toData(hash));
}
{
int maxdepth = debuggerCore()->action(MaximalStackDepth)->value().toInt();
ThreadId curthread = threadsHandler()->currentThread();
stackOptions += "maxdepth:" + QByteArray::number(maxdepth);
stackOptions += ",curthread:" + QByteArray::number(curthread.raw());
}
QByteArray result;
result += "\"locals\":\"" + localsOptions + '"';
result += ",\"stack\":\"" + stackOptions + '"';
result += ",\"threads\":\"" + threadsOptions + '"';
return result;
Command cmd("setWatchers");
cmd.args.append("'watchers':" + Command::toData(watcherData) + ',');
runCommand(cmd);
}
void LldbEngine::refreshLocals(const GdbMi &vars)
@@ -911,10 +865,9 @@ void LldbEngine::refreshLocals(const GdbMi &vars)
dummy.iname = child["iname"].data();
GdbMi wname = child["wname"];
if (wname.isValid()) {
// Happens (only) for watched expressions. They are encoded as
// base64 encoded 8 bit data, without quotes
dummy.name = decodeData(wname.data(), Base64Encoded8Bit);
dummy.exp = dummy.name.toUtf8();
// Happens (only) for watched expressions.
dummy.exp = QByteArray::fromHex(wname.data());
dummy.name = QString::fromUtf8(dummy.exp);
} else {
dummy.name = child["name"].toUtf8();
}