From dee68a29c10542afc619f871b0a8788bea170b66 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 12 Feb 2009 13:31:19 +0100
Subject: [PATCH]     Fixes:    debugger: work on breakpoints in plugins

---
 src/plugins/debugger/debuggermanager.cpp |   4 +-
 src/plugins/debugger/debuggerplugin.cpp  |   1 -
 src/plugins/debugger/gdbengine.cpp       | 166 +++++------------------
 src/plugins/debugger/gdbengine.h         |   5 +-
 src/plugins/debugger/idebuggerengine.h   |   1 -
 5 files changed, 36 insertions(+), 141 deletions(-)

diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 213edee43c4..53eac322e45 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -561,7 +561,7 @@ void DebuggerManager::notifyInferiorUpdateFinished()
 void DebuggerManager::notifyInferiorRunningRequested()
 {
     setStatus(DebuggerInferiorRunningRequested);
-    showStatusMessage(tr("Running..."), 5000);
+    showStatusMessage(tr("Running requested..."), 5000);
 }
 
 void DebuggerManager::notifyInferiorRunning()
@@ -579,7 +579,7 @@ void DebuggerManager::notifyInferiorExited()
 void DebuggerManager::notifyInferiorPidChanged(int pid)
 {
     //QMessageBox::warning(0, "PID", "PID: " + QString::number(pid)); 
-    //qDebug() << "PID: " << pid; 
+    qDebug() << "PID: " << pid; 
     emit inferiorPidChanged(pid);
 }
 
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 18c7e6d0c56..d3e61c79c29 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -337,7 +337,6 @@ void GdbOptionPage::apply()
     m_settings.m_pluginSelectedBreakpointsPattern =
         m_ui.lineEditSelectedPluginBreakpointsPattern->text();
 
-
     *m_plugin->m_manager->settings() = m_settings;
     m_plugin->writeSettings();
 }
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 8b4051f839d..9f0a3b3ace1 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -99,10 +99,8 @@ enum GdbCommandType
     GdbQueryPwd,
     GdbQuerySources,
     GdbAsyncOutput2,
+    GdbStart,
     GdbExecRun,
-    GdbExecStart1,
-    GdbExecStart2,
-    GdbExecStart3,
     GdbExecRunToFunction,
     GdbExecStep,
     GdbExecNext,
@@ -460,13 +458,28 @@ void GdbEngine::handleResponse()
                 break;
             }
 
-            case '~':
-            case '@':
+            case '~': {
+                QString data = GdbMi::parseCString(from, to);
+                m_pendingConsoleStreamOutput += data;
+                m_inbuffer = QByteArray(from, to - from);
+                break;
+            }
+
+            case '@': {
+                QString data = GdbMi::parseCString(from, to);
+                m_pendingTargetStreamOutput += data;
+                m_inbuffer = QByteArray(from, to - from);
+                break;
+            }
+
             case '&': {
                 QString data = GdbMi::parseCString(from, to);
-                handleStreamOutput(data, c);
-                //dump(oldfrom, from, record.toString());
+                m_pendingLogStreamOutput += data;
                 m_inbuffer = QByteArray(from, to - from);
+                // On Windows, the contents seem to depend on the debugger
+                // version and/or OS version used.
+                if (data.startsWith("warning:"))
+                    qq->showApplicationOutput(data);
                 break;
             }
 
@@ -759,14 +772,8 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
             handleExecRun(record);
             break;
 
-        case GdbExecStart1:
-            handleExecStart1(record);
-            break;
-        case GdbExecStart2:
-            //handleExecStart2(record);
-            break;
-        case GdbExecStart3:
-            handleExecStart3(record);
+        case GdbStart:
+            handleStart(record);
             break;
         case GdbInfoProc:
             handleInfoProc(record);
@@ -1028,84 +1035,6 @@ void GdbEngine::handleExecRunToFunction(const GdbResultRecord &record)
     q->gotoLocation(file, line, true);
 }
 
-void GdbEngine::handleStreamOutput(const QString &data, char code)
-{
-    // Linux
-    if (data.contains("[New Thread")) {
-        QRegExp re("\\[New Thread 0x([0-9a-f]*) \\(LWP ([0-9]*)\\)\\]");
-        if (re.indexIn(data) != -1)
-            maybeHandleInferiorPidChanged(re.cap(2));
-    }
-
-    // Mac
-    if (data.contains("[Switching to process ")) {
-        QRegExp re("\\[Switching to process ([0-9]*) local thread 0x([0-9a-f]*)\\]");
-        if (re.indexIn(data) != -1)
-            maybeHandleInferiorPidChanged(re.cap(1));
-    }
-
-    // present it twice: now and together with the next 'real' result
-    switch (code) {
-        case '~':
-            m_pendingConsoleStreamOutput += data;
-            break;
-        case '@':
-            m_pendingTargetStreamOutput += data;
-            break;
-        case '&':
-            m_pendingLogStreamOutput += data;
-            // On Windows, the contents seem to depend on the debugger
-            // version and/or OS version used.
-            if (data.startsWith("warning:"))
-                qq->showApplicationOutput(data);
-            break;
-    }
-
-#ifdef Q_OS_LINUX
-    if (data.startsWith("Pending break") && data.contains("\" resolved")) {
-        qDebug() << "SCHEDULING -break-list";
-        //m_breakListOnStopNeeded = true;
-    }
-#endif
-
-#if 0
-    if (m_slurpingPTypeOutput)
-        qDebug() << "SLURP: " << output.data;
-
-    //  "No symbol \"__dlopen\" in current context."
-    //  "No symbol \"dlopen\" in current context."
-    if (output.data.startsWith("No symbol ")
-            && output.data.contains("dlopen")) {
-        m_dlopened = true;
-        return;
-    }
-
-    // output of 'ptype <foo>'
-    if (output.data.startsWith("type = ")) {
-        if (output.data.endsWith("{") || output.data.endsWith("{\\n")) {
-            // multi-line output started here...
-            m_slurpingPTypeOutput = true;
-            m_slurpedPTypeOutput = output.data;
-        } else {
-            // Happens for simple types. Process it immediately
-            m_watchHandler->handleTypeContents(output.data);
-        }
-        return;
-    }
-    if (m_slurpingPTypeOutput) {
-        m_slurpedPTypeOutput += '\n';
-        m_slurpedPTypeOutput += output.data;
-        if (output.data.startsWith("}")) {
-            // this is the last line...
-            m_slurpingPTypeOutput = false;
-            m_watchHandler->handleTypeContents(m_slurpedPTypeOutput);
-            m_slurpedPTypeOutput.clear();
-        }
-        return;
-    }
-#endif
-}
-
 static bool isExitedReason(const QString &reason)
 {
     return reason == QLatin1String("exited-normally")   // inferior exited normally
@@ -1633,13 +1562,17 @@ bool GdbEngine::startDebugger()
     }
 
     if (q->startMode() == q->startInternal) {
+        emit gdbInputAvailable(QString(), QString());
         sendCommand("-file-exec-and-symbols " + fileName, GdbFileExecAndSymbols);
         //sendCommand("file " + fileName, GdbFileExecAndSymbols);
         #ifdef Q_OS_MAC
         sendCommand("sharedlibrary apply-load-rules all");
         #endif
-        //sendCommand("-gdb-set stop-on-solib-events 1");
-        runInferior();
+        setTokenBarrier();
+        if (!q->m_processArgs.isEmpty())
+            sendCommand("-exec-arguments " + q->m_processArgs.join(" "));
+        sendCommand("set auto-solib-add off");
+        sendCommand("x/2i _start", GdbStart);
     }
 
     if (q->startMode() == q->attachExternal) {
@@ -1678,21 +1611,7 @@ void GdbEngine::continueInferior()
     sendCommand("-exec-continue", GdbExecContinue);
 }
 
-void GdbEngine::runInferior()
-{
-    q->resetLocation();
-    // FIXME: this ignores important startup messages
-    setTokenBarrier();
-    if (!q->m_processArgs.isEmpty())
-        sendCommand("-exec-arguments " + q->m_processArgs.join(" "));
-    qq->notifyInferiorRunningRequested();
-    emit gdbInputAvailable(QString(), QString());
-
-    sendCommand("set auto-solib-add off");
-    sendCommand("x/2i _start", GdbExecStart1);
-}
-
-void GdbEngine::handleExecStart1(const GdbResultRecord &response)
+void GdbEngine::handleStart(const GdbResultRecord &response)
 {
     if (response.resultClass == GdbResultDone) {
         // stdout:&"x/2i _start\n"
@@ -1702,8 +1621,9 @@ void GdbEngine::handleExecStart1(const GdbResultRecord &response)
         QRegExp needle("0x([0-9a-f]+) <_start\\+.*>:");
         if (needle.indexIn(msg) != -1) {
             //qDebug() << "STREAM: " << msg << needle.cap(1);
-            sendCommand("tbreak *0x" + needle.cap(1)); // GdbExecStart3);
-            sendCommand("-exec-run"); // GdbExecStart3);
+            sendCommand("tbreak *0x" + needle.cap(1));
+            sendCommand("-exec-run");
+            qq->notifyInferiorRunningRequested();
         } else {
             qDebug() << "PARSING START ADDRESS FAILED" << msg;
         }
@@ -1712,20 +1632,6 @@ void GdbEngine::handleExecStart1(const GdbResultRecord &response)
     }
 }
 
-void GdbEngine::handleExecStart3(const GdbResultRecord &)
-{
-#if defined(Q_OS_WIN)
-    sendCommand("info proc", GdbInfoProc);
-#endif
-#if defined(Q_OS_LINUX)
-    sendCommand("info proc", GdbInfoProc);
-#endif
-#if defined(Q_OS_MAC)
-    sendCommand("info pid", GdbInfoProc, QVariant(), true);
-#endif
-    attemptBreakpointSynchronization();
-}
-
 void GdbEngine::stepExec()
 {
     setTokenBarrier();
@@ -2244,12 +2150,7 @@ void GdbEngine::attemptBreakpointSynchronization()
         }
     }
 
-    if (updateNeeded) {
-        //interruptAndContinue();
-        //sendListBreakpoints();
-    }
-
-    if (!updateNeeded && q->status() == DebuggerProcessStartingUp) {
+    if (!updateNeeded) {
         // we continue the execution
         continueInferior();
     }
@@ -4017,7 +3918,6 @@ void GdbEngine::assignValueInDebugger(const QString &expression, const QString &
     sendCommand("-var-assign assign " + value, WatchVarAssign);
 }
 
-
 void GdbEngine::tryLoadCustomDumpers()
 {
     if (m_dataDumperState != DataDumperUninitialized)
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index 7973ef4c681..0b304e10660 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -113,7 +113,6 @@ private:
     void exitDebugger();
 
     void continueInferior();
-    void runInferior();
     void interruptInferior();
 
     void runToLineExec(const QString &fileName, int lineNumber);
@@ -179,14 +178,12 @@ private slots:
 
 private:
     int terminationIndex(const QByteArray &buffer, int &length);
-    void handleStreamOutput(const QString &output, char code);
+    void handleStart(const GdbResultRecord &response);
     void handleAsyncOutput2(const GdbMi &data);
     void handleAsyncOutput(const GdbMi &data);
     void handleResultRecord(const GdbResultRecord &response);
     void handleFileExecAndSymbols(const GdbResultRecord &response);
     void handleExecRun(const GdbResultRecord &response);
-    void handleExecStart1(const GdbResultRecord &response);
-    void handleExecStart3(const GdbResultRecord &response);
     void handleExecJumpToLine(const GdbResultRecord &response);
     void handleExecRunToFunction(const GdbResultRecord &response);
     void handleInfoShared(const GdbResultRecord &response);
diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h
index 1558d140ee6..ee1e15793f3 100644
--- a/src/plugins/debugger/idebuggerengine.h
+++ b/src/plugins/debugger/idebuggerengine.h
@@ -62,7 +62,6 @@ public:
     virtual void nextIExec() = 0;
     
     virtual void continueInferior() = 0;
-    virtual void runInferior() = 0;
     virtual void interruptInferior() = 0;
 
     virtual void runToLineExec(const QString &fileName, int lineNumber) = 0;
-- 
GitLab