From f73a4d5fd87bb6efbd3b512527238b278b5963af Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Mon, 16 Mar 2009 13:16:17 +0100
Subject: [PATCH] Fixes: debugger: try accessing compiled-in dumpers when
 attaching to an external application

---
 src/plugins/debugger/debuggermanager.cpp | 34 +++++++++++++++++++++--
 src/plugins/debugger/debuggermanager.h   |  1 +
 src/plugins/debugger/gdbengine.cpp       | 35 ++++++++++++------------
 src/plugins/debugger/gdbengine.h         |  4 +--
 src/plugins/debugger/idebuggerengine.h   |  1 +
 src/plugins/debugger/scriptengine.h      |  1 +
 src/plugins/debugger/watchwindow.cpp     |  4 +++
 src/plugins/debugger/watchwindow.h       |  1 +
 8 files changed, 59 insertions(+), 22 deletions(-)

diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 27109f952e8..a233df34457 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -296,6 +296,8 @@ void DebuggerManager::init()
         this, SLOT(watchExpression(QString)));
     connect(localsView, SIGNAL(settingsDialogRequested()),
         this, SIGNAL(settingsDialogRequested()));
+    connect(localsView, SIGNAL(requestRecheckCustomDumperAvailability()),
+        this, SLOT(recheckCustomDumperAvailability()));
 
     // Watchers 
     QTreeView *watchersView = qobject_cast<QTreeView *>(m_watchersWindow);
@@ -316,6 +318,8 @@ void DebuggerManager::init()
         this, SIGNAL(setSessionValueRequested(QString,QVariant)));
     connect(watchersView, SIGNAL(settingsDialogRequested()),
         this, SIGNAL(settingsDialogRequested()));
+    connect(watchersView, SIGNAL(requestRecheckCustomDumperAvailability()),
+        this, SLOT(recheckCustomDumperAvailability()));
 
     // Tooltip
     QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow);
@@ -993,13 +997,13 @@ bool DebuggerManager::startNewDebugger(DebuggerStartMode mode)
         qDebug() << m_executable << type;
 
     setDebuggerType(type);
+    setBusyCursor(false);
     setStatus(DebuggerProcessStartingUp);
     if (!m_engine->startDebugger()) {
         setStatus(DebuggerProcessNotReady);
         return false;
     }
 
-    m_busy = false;
     return true;
 }
 
@@ -1199,6 +1203,18 @@ void DebuggerManager::breakAtMain()
 #endif
 }
 
+static bool isAllowedTransition(int from, int to)
+{
+    return (from == -1)
+      || (from == DebuggerProcessNotReady && to == DebuggerProcessStartingUp)
+      || (from == DebuggerProcessStartingUp && to == DebuggerInferiorStopped)
+      || (from == DebuggerInferiorStopped && to == DebuggerInferiorRunningRequested)
+      || (from == DebuggerInferiorRunningRequested && to == DebuggerInferiorRunning)
+      || (from == DebuggerInferiorRunning && to == DebuggerInferiorStopRequested)
+      || (from == DebuggerInferiorStopRequested && to == DebuggerInferiorStopped)
+      || (to == DebuggerProcessNotReady);  
+}
+
 void DebuggerManager::setStatus(int status)
 {
     if (Debugger::Constants::Internal::debug)
@@ -1207,6 +1223,10 @@ void DebuggerManager::setStatus(int status)
     if (status == m_status)
         return;
 
+    if (!isAllowedTransition(m_status, status))
+        qDebug() << "UNEXPECTED TRANSITION:  " << m_status << status;
+
+
     m_status = status;
 
     const bool started = status == DebuggerInferiorRunning
@@ -1255,9 +1275,9 @@ void DebuggerManager::setStatus(int status)
 
 void DebuggerManager::setBusyCursor(bool busy)
 {
+    //qDebug() << "BUSY FROM: " << m_busy << " TO: " <<  m_busy;
     if (busy == m_busy)
         return;
-    //qDebug() << "BUSY: " << busy;
     m_busy = busy;
 
     QCursor cursor(busy ? Qt::BusyCursor : Qt::ArrowCursor);
@@ -1413,6 +1433,16 @@ void DebuggerManager::fileOpen(const QString &fileName)
 }
 
 
+//////////////////////////////////////////////////////////////////////
+//
+// Watch specific stuff
+//
+//////////////////////////////////////////////////////////////////////
+
+void DebuggerManager::recheckCustomDumperAvailability()
+{
+    m_engine->recheckCustomDumperAvailability();
+}
 
 //////////////////////////////////////////////////////////////////////
 //
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index dd0b854503c..4221ae4a49e 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -311,6 +311,7 @@ private slots:
     void setStatus(int status);
     void clearStatusMessage();
     void attemptBreakpointSynchronization();
+    void recheckCustomDumperAvailability();
 
 private:
     //
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 0280ce6ede2..8fbd3a9ca83 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -112,8 +112,7 @@ enum GdbCommandType
     GdbInfoShared,
     GdbInfoProc,
     GdbInfoThreads,
-    GdbQueryDataDumper1,
-    GdbQueryDataDumper2,
+    GdbQueryDataDumper,
     GdbTemporaryContinue,
     GdbTargetCore,
 
@@ -799,11 +798,8 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
         case GdbInfoShared:
             handleInfoShared(record);
             break;
-        case GdbQueryDataDumper1:
-            handleQueryDataDumper1(record);
-            break;
-        case GdbQueryDataDumper2:
-            handleQueryDataDumper2(record);
+        case GdbQueryDataDumper:
+            handleQueryDataDumper(record);
             break;
         case GdbTemporaryContinue:
             continueInferior();
@@ -1570,7 +1566,7 @@ bool GdbEngine::startDebugger()
     gdbArgs.prepend(QLatin1String("mi"));
     gdbArgs.prepend(QLatin1String("-i"));
 
-    if (q->startMode() == AttachCore) {
+    if (q->startMode() == AttachCore || q->startMode() == AttachExternal) {
         // nothing to do
     } else if (q->m_useTerminal) {
         m_stubProc.stop(); // We leave the console open, so recycle it now.
@@ -1778,6 +1774,7 @@ void GdbEngine::handleAttach()
     handleAqcuiredInferior();
 
     q->resetLocation();
+    recheckCustomDumperAvailability();
 
     //
     // Stack
@@ -3520,14 +3517,9 @@ void GdbEngine::updateWatchModel2()
     }
 }
 
-void GdbEngine::handleQueryDataDumper1(const GdbResultRecord &record)
-{
-    Q_UNUSED(record);
-}
-
-void GdbEngine::handleQueryDataDumper2(const GdbResultRecord &record)
+void GdbEngine::handleQueryDataDumper(const GdbResultRecord &record)
 {
-    //qDebug() << "DATA DUMPER TRIAL:" << record.toString();
+    qDebug() << "DATA DUMPER TRIAL:" << record.toString();
     GdbMi output = record.data.findChild("consolestreamoutput");
     QByteArray out = output.data();
     out = out.mid(out.indexOf('"') + 2); // + 1 is success marker
@@ -3568,6 +3560,8 @@ void GdbEngine::handleQueryDataDumper2(const GdbResultRecord &record)
                 );
     } else {
         m_dataDumperState = DataDumperAvailable;
+        q->showStatusMessage(tr("%1 custom dumpers found")
+            .arg(m_availableSimpleDumpers.size()));
     }
     //qDebug() << "DATA DUMPERS AVAILABLE" << m_availableSimpleDumpers;
 }
@@ -4274,9 +4268,8 @@ void GdbEngine::tryLoadCustomDumpers()
 
     if (m_dataDumperState == DataDumperLoadTried) {
         // retreive list of dumpable classes
-        sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)",
-            GdbQueryDataDumper1);
-        sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper2);
+        sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)");
+        sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper);
     } else {
         debugMessage(QString("DEBUG HELPER LIBRARY IS NOT USABLE: "
             " %1  EXISTS: %2, EXECUTABLE: %3").arg(lib)
@@ -4285,6 +4278,12 @@ void GdbEngine::tryLoadCustomDumpers()
     }
 }
 
+void GdbEngine::recheckCustomDumperAvailability()
+{
+    // retreive list of dumpable classes
+    sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)");
+    sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper);
+}
 
 IDebuggerEngine *createGdbEngine(DebuggerManager *parent)
 {
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index 0205b1a862d..3a62620ecfc 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -304,6 +304,7 @@ private:
     void maybeHandleInferiorPidChanged(const QString &pid);
 
     void tryLoadCustomDumpers();
+    Q_SLOT void recheckCustomDumperAvailability();
     void runCustomDumper(const WatchData &data, bool dumpChildren);
     void runDirectDumper(const WatchData &data, bool dumpChildren);
     bool isCustomValueDumperAvailable(const QString &type) const;
@@ -317,8 +318,7 @@ private:
         const WatchData &cookie);
     void handleToolTip(const GdbResultRecord &record,
         const QString &cookie);
-    void handleQueryDataDumper1(const GdbResultRecord &record);
-    void handleQueryDataDumper2(const GdbResultRecord &record);
+    void handleQueryDataDumper(const GdbResultRecord &record);
     void handleDumpCustomValue1(const GdbResultRecord &record,
         const WatchData &cookie);
     void handleDumpCustomValue2(const GdbResultRecord &record,
diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h
index bfa7661c269..d4087422d08 100644
--- a/src/plugins/debugger/idebuggerengine.h
+++ b/src/plugins/debugger/idebuggerengine.h
@@ -83,6 +83,7 @@ public:
     virtual void reloadRegisters() = 0;
     virtual void setDebugDumpers(bool on) = 0;
     virtual void setUseCustomDumpers(bool on) = 0;
+    virtual void recheckCustomDumperAvailability() = 0;
 
     virtual void reloadSourceFiles() = 0;
 };
diff --git a/src/plugins/debugger/scriptengine.h b/src/plugins/debugger/scriptengine.h
index d791ebc6658..11ea1b1fce2 100644
--- a/src/plugins/debugger/scriptengine.h
+++ b/src/plugins/debugger/scriptengine.h
@@ -99,6 +99,7 @@ private:
 
     void setDebugDumpers(bool) {}
     void setUseCustomDumpers(bool) {}
+    void recheckCustomDumperAvailability() {}
 
     void assignValueInDebugger(const QString &expr, const QString &value);
     void executeDebuggerCommand(const QString & command);
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 285b7d5e91a..a3df668cb60 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -105,6 +105,7 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     QAction *act3 = 0;
     QAction *act4 = 0;
     QAction *act5 = new QAction("Debugger properties...", &menu);
+    QAction *act6 = new QAction("Re-check availability of custom dumpers", &menu);
 
     menu.addAction(act1);
     menu.addAction(act2);
@@ -130,6 +131,7 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
         // FIXME: menu.addAction(act4);
     }
     menu.addSeparator();
+    menu.addAction(act6);
     menu.addAction(act5);
 
     QAction *act = menu.exec(ev->globalPos());
@@ -149,6 +151,8 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
         model()->setData(mi0, !visual, VisualRole);
     else if (act == act5)
         emit settingsDialogRequested();
+    else if (act == act6)
+        emit requestRecheckCustomDumperAvailability();
 }
 
 void WatchWindow::resizeColumnsToContents()
diff --git a/src/plugins/debugger/watchwindow.h b/src/plugins/debugger/watchwindow.h
index fa3126005b1..27a622494ef 100644
--- a/src/plugins/debugger/watchwindow.h
+++ b/src/plugins/debugger/watchwindow.h
@@ -63,6 +63,7 @@ signals:
     void requestAssignValue(const QString &exp, const QString &value);
     void requestExpandChildren(const QModelIndex &idx);
     void requestCollapseChildren(const QModelIndex &idx);
+    void requestRecheckCustomDumperAvailability();
     void settingsDialogRequested();
 
 private slots:
-- 
GitLab