diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp index a3b3de6a4de92e51bbc0d50788010beefd2460f8..e99c4dc8a1f1723a5deb7990005a26e7408a914a 100644 --- a/bin/gdbmacros/gdbmacros.cpp +++ b/bin/gdbmacros/gdbmacros.cpp @@ -2157,6 +2157,7 @@ static void qDumpStdMap(QDumper &d) // HACK: we need a properly const qualified version of the // std::pair used. We extract it from the allocator parameter + // (#4, "std::allocator<std::pair<key, value> >") // as it is there, and, equally importantly, in an order that // gdb accepts when fed with it. char *pairType = (char *)(d.templateParameters[3]) + 16; diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ae32033b0dd43a7f4f71719568be46c9fcb76c5e..62820b3fd1b03627da623d0bf0f8c3722a509bf7 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -250,6 +250,10 @@ void DebuggerManager::init() this, SLOT(watchExpression(QString))); connect(watchersView, SIGNAL(requestRemoveWatchExpression(QString)), this, SLOT(removeWatchExpression(QString))); + connect(m_watchHandler, SIGNAL(sessionValueRequested(QString,QVariant*)), + this, SIGNAL(sessionValueRequested(QString,QVariant*))); + connect(m_watchHandler, SIGNAL(setSessionValueRequested(QString,QVariant)), + this, SIGNAL(setSessionValueRequested(QString,QVariant))); // Tooltip QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow); @@ -948,6 +952,7 @@ void DebuggerManager::aboutToSaveSession() void DebuggerManager::loadSessionData() { m_breakHandler->loadSessionData(); + m_watchHandler->loadSessionData(); QVariant value; querySessionValue(QLatin1String("UseFastStart"), &value); @@ -964,6 +969,7 @@ void DebuggerManager::loadSessionData() void DebuggerManager::saveSessionData() { m_breakHandler->saveSessionData(); + m_watchHandler->saveSessionData(); setSessionValue(QLatin1String("UseFastStart"), m_useFastStartAction->isChecked()); diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 59e37f2acb3144ca23a15ba8c0bef3fa246710af..152011c26ea04a2bde505d77900eb7578e1adfc0 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -888,6 +888,8 @@ void WatchHandler::watchExpression(const QString &exp) data.name = exp; data.iname = "watch." + exp; insertData(data); + m_watchers.append(exp); + saveWatchers(); emit watchModelUpdateRequested(); } @@ -965,7 +967,9 @@ void WatchHandler::showEditValue(const WatchData &data) void WatchHandler::removeWatchExpression(const QString &iname) { MODEL_DEBUG("REMOVE WATCH: " << iname); - (void) takeData(iname); + WatchData data = takeData(iname); + m_watchers.removeOne(data.iname); + saveWatchers(); emit watchModelUpdateRequested(); } @@ -973,19 +977,26 @@ void WatchHandler::reinitializeWatchers() { m_completeSet = initialSet(); m_incompleteSet.clear(); + reinitializeWatchersHelper(); +} +void WatchHandler::reinitializeWatchersHelper() +{ // copy over all watchers and mark all watchers as incomplete - for (int i = 0, n = m_oldSet.size(); i < n; ++i) { - WatchData data = m_oldSet.at(i); - if (data.isWatcher()) { - data.level = -1; - data.row = -1; - data.parentIndex = -1; - data.variable.clear(); - data.setAllNeeded(); - data.valuedisabled = false; - insertData(data); // properly handles "neededChildren" - } + int i = 0; + foreach (const QString &exp, m_watchers) { + WatchData data; + data.level = -1; + data.row = -1; + data.parentIndex = -1; + data.variable.clear(); + data.setAllNeeded(); + data.valuedisabled = false; + data.iname = "watch." + QString::number(i); + data.name = exp; + data.exp = exp; + insertData(data); + ++i; } } @@ -1180,3 +1191,29 @@ bool WatchHandler::checkIndex(int id) const } return true; } + +void WatchHandler::loadWatchers() +{ + QVariant value; + sessionValueRequested("Watchers", &value); + m_watchers = value.toStringList(); + qDebug() << "LOAD WATCHERS: " << m_watchers; + reinitializeWatchersHelper(); +} + +void WatchHandler::saveWatchers() +{ + qDebug() << "SAVE WATCHERS: " << m_watchers; + setSessionValueRequested("Watchers", m_watchers); +} + +void WatchHandler::saveSessionData() +{ + saveWatchers(); +} + +void WatchHandler::loadSessionData() +{ + loadWatchers(); + rebuildModel(); +} diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index 4ac2218a47118024fb9a253005f1df715aba4747..4c2a20b167f8f64560f665a1e6ff21f5e1444869 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -186,13 +186,23 @@ public: WatchData *findData(const QString &iname); + void loadSessionData(); + void saveSessionData(); + signals: void watchModelUpdateRequested(); + void sessionValueRequested(const QString &name, QVariant *value); + void setSessionValueRequested(const QString &name, const QVariant &value); + private: + void reinitializeWatchersHelper(); WatchData takeData(const QString &iname); QString toString() const; + void loadWatchers(); + void saveWatchers(); + bool m_expandPointers; bool m_inChange; @@ -203,6 +213,7 @@ private: QList<WatchData> m_completeSet; QList<WatchData> m_oldSet; QList<WatchData> m_displaySet; + QStringList m_watchers; void setDisplayedIName(const QString &iname, bool on); QSet<QString> m_expandedINames; // those expanded in the treeview diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 24626064e4f1fb4d66484cdedd5da404df3e5774..5156e6fb5fd2e58944a397033a2fdc2aff7ab815 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -116,7 +116,7 @@ private: void testArray() { - QString x[4]; + QString x[20]; x[0] = "a"; x[1] = "b"; x[2] = "c";