diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 944c7b5a730f35f543dcb977882a57d8d8e5a169..bec8ed7171030ee6d61467d56f05f3f90c5a7e44 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -6,6 +6,7 @@ import sys import traceback import gdb +import base64 import curses.ascii verbosity = 0 @@ -195,10 +196,11 @@ class FrameCommand(gdb.Command): passExceptions = int(args[1]) expandedINames = set() if len(args) > 2: - expandedINames = set(args[2].split(',')) - watchers = set() + expandedINames = set(args[2].split(",")) + watchers = () if len(args) > 3: - watchers = set(args[3].split(',')) + #watchers = set(args[3].split(',')) + watchers = base64.b64decode(args[3]).split("$") #warn("EXPANDED INAMES: %s" % expandedINames) #warn("WATCHERS: %s" % watchers) module = sys.modules[__name__] @@ -222,24 +224,31 @@ class FrameCommand(gdb.Command): print output return + if useFancy: for key, value in module.__dict__.items(): #if callable(value): if key.startswith("qqDump"): self.dumpers[key[6:]] = value - try: - frame = gdb.selected_frame() - except RuntimeError: - return "" d = Dumper() d.dumpers = self.dumpers d.passExceptions = passExceptions d.ns = qtNamespace() - block = frame.block() + d.expandedINames = expandedINames + d.useFancy = useFancy #warn(" NAMESPACE IS: '%s'" % d.ns) - #warn("FRAME %s: " % frame) + # + # Locals + # + try: + frame = gdb.selected_frame() + #warn("FRAME %s: " % frame) + except RuntimeError: + return "" + + block = frame.block() while True: if block is None: warn("UNEXPECTED 'None' BLOCK") @@ -263,8 +272,6 @@ class FrameCommand(gdb.Command): continue #warn("ITEM %s: " % item.value) - d.expandedINames = expandedINames - d.useFancy = useFancy d.beginHash() d.put('iname="%s",' % item.iname) d.safePutItemHelper(item) @@ -278,6 +285,30 @@ class FrameCommand(gdb.Command): block = block.superblock #warn("BLOCK %s: " % block) + # + # Watchers + # + watcherCount = 0 + for watcher in watchers: + warn("HANDLING WATCH %s" % watcher) + name = str(watcherCount) + try: + value = gdb.parse_and_eval(watcher) + 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: + d.beginHash() + d.put('iname="watch.%d",' % watcherCount) + d.put('name="%s",' % watcher) + d.put('value="<invalid>",' % watcherCount) + d.put('type=<unknown>,numchild="0"') + d.endHash() + watcherCount += 1 + d.pushOutput() print('locals={iname="local",name="Locals",value=" ",type=" ",' diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 85688780f6138dc10ade3e915ff6d6986abc4734..bc7ee0ddd44c1209d2d97438717eec157014e717 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3543,10 +3543,20 @@ void GdbEngine::updateLocals(const QVariant &cookie) m_processedNames.clear(); manager()->watchHandler()->beginCycle(); m_toolTipExpression.clear(); - QStringList expanded = m_manager->watchHandler()->expandedINames().toList(); - postCommand(_("-interpreter-exec console \"bb %1 0 %2\"") + WatchHandler *handler = m_manager->watchHandler(); + QStringList expanded = handler->expandedINames().toList(); + QString watchers; + foreach (QString item, handler->watchedExpressions()) { + if (!watchers.isEmpty()) + watchers += _("$"); + //item.replace(_("\""), _("\\\"")); + watchers += item; + } + + postCommand(_("-interpreter-exec console \"bb %1 0 %2 %3\"") .arg(int(theDebuggerBoolSetting(UseDebuggingHelpers))) - .arg(expanded.join(_(","))), + .arg(expanded.join(_(","))) + .arg(_(watchers.toLatin1().toBase64())), CB(handleStackFrame)); } else { m_processedNames.clear(); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 863997462211e72951768f6e6b06aa386842e29a..fdcae7dda21f47c493ce50c7df36a0b08aae3fc0 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -644,7 +644,8 @@ static QString formattedValue(const WatchData &data, bool WatchModel::canFetchMore(const QModelIndex &index) const { - return !m_inExtraLayoutChanged && index.isValid() && !m_fetchTriggered.contains(watchItem(index)->iname); + return !m_inExtraLayoutChanged && index.isValid() + && !m_fetchTriggered.contains(watchItem(index)->iname); } void WatchModel::fetchMore(const QModelIndex &index) @@ -1389,10 +1390,9 @@ void WatchHandler::loadWatchers() //reinitializeWatchersHelper(); } -void WatchHandler::saveWatchers() +QStringList WatchHandler::watchedExpressions() const { - //qDebug() << "SAVE WATCHERS: " << m_watchers; - // Filter out valid watchers. + // Filter out invalid watchers. QStringList watcherNames; QHashIterator<QString, int> it(m_watcherNames); while (it.hasNext()) { @@ -1401,7 +1401,13 @@ void WatchHandler::saveWatchers() if (!watcherName.isEmpty() && watcherName != watcherEditPlaceHolder()) watcherNames.push_back(watcherName); } - m_manager->setSessionValue("Watchers", QVariant(watcherNames)); + return watcherNames; +} + +void WatchHandler::saveWatchers() +{ + //qDebug() << "SAVE WATCHERS: " << m_watchers; + m_manager->setSessionValue("Watchers", QVariant(watchedExpressions())); } void WatchHandler::loadTypeFormats() diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index f0b31c03ead0c69cc261ba2d11248dcd27e5866f..50852d3838c04ebb671c3d09486e2f591b154790 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -274,6 +274,7 @@ public: { return m_expandedINames.contains(iname); } QSet<QString> expandedINames() const { return m_expandedINames; } + QStringList watchedExpressions() const; static QString watcherEditPlaceHolder();