diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index bec8ed7171030ee6d61467d56f05f3f90c5a7e44..67743aab3737453a8d25862ed4b6c1a733b7cb26 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -294,17 +294,17 @@ class FrameCommand(gdb.Command): name = str(watcherCount) try: value = gdb.parse_and_eval(watcher) - item = Item(value), "watch", name, name) + item = Item(value, "watch", name, name) warn(" VALUE %s" % item.value) d.beginHash() d.put('iname="%s",' % item.iname) d.safePutItemHelper(item) d.endHash() - else: + except RuntimeError: d.beginHash() d.put('iname="watch.%d",' % watcherCount) d.put('name="%s",' % watcher) - d.put('value="<invalid>",' % watcherCount) + d.put('value="<invalid>",') d.put('type=<unknown>,numchild="0"') d.endHash() watcherCount += 1 diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index bc7ee0ddd44c1209d2d97438717eec157014e717..8c9da78ad084e24d07e021c30a3f83b6a8598dad 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2819,7 +2819,7 @@ static void setWatchDataValueEditable(WatchData &data, const GdbMi &mi) static void setWatchDataExpression(WatchData &data, const GdbMi &mi) { if (mi.isValid()) - data.exp = _('(' + mi.data() + ')'); + data.exp = _(mi.data()); } static void setWatchDataAddress(WatchData &data, const GdbMi &mi) @@ -2827,7 +2827,7 @@ static void setWatchDataAddress(WatchData &data, const GdbMi &mi) if (mi.isValid()) { data.addr = _(mi.data()); if (data.exp.isEmpty() && !data.addr.startsWith(_("$"))) - data.exp = _("(*(") + gdbQuoteTypes(data.type) + _("*)") + data.addr + _c(')'); + data.exp = _("*(") + gdbQuoteTypes(data.type) + _("*)") + data.addr; } } @@ -2886,9 +2886,9 @@ void GdbEngine::runDirectDebuggingHelper(const WatchData &data, bool dumpChildre QString cmd; if (type == __("QString") || type.endsWith(__("::QString"))) - cmd = _("qdumpqstring (&") + data.exp + _c(')'); + cmd = _("qdumpqstring (&(") + data.exp + _("))"); else if (type == __("QStringList") || type.endsWith(__("::QStringList"))) - cmd = _("qdumpqstringlist (&") + data.exp + _c(')'); + cmd = _("qdumpqstringlist (&(") + data.exp + _("))"); QVariant var; var.setValue(data); @@ -3546,17 +3546,22 @@ void GdbEngine::updateLocals(const QVariant &cookie) WatchHandler *handler = m_manager->watchHandler(); QStringList expanded = handler->expandedINames().toList(); QString watchers; - foreach (QString item, handler->watchedExpressions()) { + QHash<QString, int> watcherNames = handler->watcherNames(); + QHashIterator<QString, int> it(watcherNames); + while (it.hasNext()) { + it.next(); if (!watchers.isEmpty()) - watchers += _("$"); - //item.replace(_("\""), _("\\\"")); - watchers += item; + watchers += _("$$"); + if (it.key() == WatchHandler::watcherEditPlaceHolder()) + watchers += _("<Edit>$%1").arg(it.value()); + else + watchers += _("%1$%2").arg(it.key()).arg(it.value()); } postCommand(_("-interpreter-exec console \"bb %1 0 %2 %3\"") .arg(int(theDebuggerBoolSetting(UseDebuggingHelpers))) .arg(expanded.join(_(","))) - .arg(_(watchers.toLatin1().toBase64())), + .arg(_(watchers.toLatin1().toHex())), CB(handleStackFrame)); } else { m_processedNames.clear(); @@ -3598,18 +3603,22 @@ void GdbEngine::handleStackFrame(const GdbResponse &response) GdbMi all; all.fromStringMultiple(out); - //qDebug() << "\n\n\nALL: " << all.toString() << "\n"; GdbMi locals = all.findChild("locals"); - //qDebug() << "\n\n\nLOCALS: " << locals.toString() << "\n"; WatchData *data = manager()->watchHandler()->findItem(_("local")); QTC_ASSERT(data, return); - QList<WatchData> list; - //foreach (const GdbMi &local, locals.children) - // handleChildren(*data, local, &list); handleChildren(*data, locals, &list); //for (int i = 0; i != list.size(); ++i) - // qDebug() << "READ: " << list.at(i).toString(); + // qDebug() << "LOCAL: " << list.at(i).toString(); + manager()->watchHandler()->insertBulkData(list); + + GdbMi watchers = all.findChild("watchers"); + data = manager()->watchHandler()->findItem(_("watch")); + QTC_ASSERT(data, return); + list.clear(); + handleChildren(*data, watchers, &list); + //for (int i = 0; i != list.size(); ++i) + // qDebug() << "WATCH: " << list.at(i).toString(); manager()->watchHandler()->insertBulkData(list); // FIXME: diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index fdcae7dda21f47c493ce50c7df36a0b08aae3fc0..b1c1a818e61448479c69e54208f89d5a31149072 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1268,7 +1268,12 @@ void WatchHandler::watchExpression(const QString &exp) if (exp.isEmpty() || exp == watcherEditPlaceHolder()) data.setAllUnneeded(); data.iname = watcherName(exp); - insertData(data); + IDebuggerEngine *engine = m_manager->currentEngine(); + if (engine && engine->isSynchroneous()) + m_manager->updateWatchData(data); + else + insertData(data); + m_manager->updateWatchData(data); saveWatchers(); } diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index 50852d3838c04ebb671c3d09486e2f591b154790..a35f05e97bccc8fd165c77938b4db7b6b4d69347 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -275,6 +275,8 @@ public: QSet<QString> expandedINames() const { return m_expandedINames; } QStringList watchedExpressions() const; + QHash<QString, int> watcherNames() const + { return m_watcherNames; } static QString watcherEditPlaceHolder(); diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index b8d2869a3bcd1a4db0777212ad1a5011fe9c6003..776e8cbd4dc5f00ae54257c72a440c335e459cf0 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -267,8 +267,15 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev) actWatchKnownMemory = new QAction(tr("Open memory editor at %1").arg(address), &menu); menu.addSeparator(); - int atype = (m_type == LocalsType) ? WatchExpression : RemoveWatchExpression; - menu.addAction(theDebuggerAction(atype)->updatedAction(exp)); + QAction *actWatchOrRemove; + if (m_type == LocalsType) { + actWatchOrRemove = theDebuggerAction(WatchExpression)->updatedAction(exp); + } else { + actWatchOrRemove = theDebuggerAction(RemoveWatchExpression)->updatedAction(exp); + // Also for the case where the user cleared the expression. + actWatchOrRemove->setEnabled(true); + } + menu.addAction(actWatchOrRemove); menu.addAction(actInsertNewWatchItem); menu.addAction(actSelectWidgetToWatch);