OSDN Git Service

debugger: re-enable interrupting in remote setups
authorhjk <qtc-committer@nokia.com>
Wed, 12 Oct 2011 14:34:02 +0000 (16:34 +0200)
committerEike Ziller <eike.ziller@nokia.com>
Tue, 18 Oct 2011 08:52:55 +0000 (10:52 +0200)
Change-Id: I6d4503ec78e3ce590691dde69992a1599b506fc5
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
(cherry picked from commit 0e8657107c8989f91b6f1b1f9ff70547ed5e962d)
Reviewed-by: Eike Ziller <eike.ziller@nokia.com>
src/plugins/debugger/debuggerengine.cpp
src/plugins/debugger/gdb/abstractgdbprocess.h
src/plugins/debugger/gdb/localgdbprocess.cpp
src/plugins/debugger/gdb/localgdbprocess.h
src/plugins/debugger/gdb/remotegdbprocess.cpp
src/plugins/debugger/gdb/remotegdbprocess.h
src/plugins/debugger/gdb/remotegdbserveradapter.cpp

index b1a1a63..246166c 100644 (file)
@@ -874,7 +874,9 @@ void DebuggerEngine::notifyInferiorRunRequested()
 void DebuggerEngine::notifyInferiorRunOk()
 {
     showMessage(_("NOTE: INFERIOR RUN OK"));
-    QTC_ASSERT(state() == InferiorRunRequested, qDebug() << this << state());
+    // Transition from StopRequested can happen sin remotegdbadapter.
+    QTC_ASSERT(state() == InferiorRunRequested
+        || state() == InferiorStopRequested, qDebug() << this << state());
     setState(InferiorRunOk);
 }
 
index dc0b110..ef6abeb 100644 (file)
@@ -54,6 +54,7 @@ public:
     virtual bool waitForStarted() = 0;
     virtual qint64 write(const QByteArray &data) = 0;
     virtual void kill() = 0;
+    virtual bool interrupt() = 0;
 
     virtual QProcess::ProcessState state() const = 0;
     virtual QString errorString() const = 0;
@@ -63,8 +64,6 @@ public:
     virtual void setEnvironment(const QStringList &env) = 0;
     virtual void setWorkingDirectory(const QString &dir) = 0;
 
-    virtual ~AbstractGdbProcess() {}
-
 signals:
     void error(QProcess::ProcessError);
     void finished(int exitCode, QProcess::ExitStatus exitStatus);
index c3c74a0..68d2179 100644 (file)
 
 #include "localgdbprocess.h"
 
+#include <utils/qtcassert.h>
+
+#ifdef Q_OS_UNIX
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+#endif
+
 namespace Debugger {
 namespace Internal {
 
@@ -77,6 +85,20 @@ void LocalGdbProcess::kill()
     m_gdbProc.kill();
 }
 
+bool LocalGdbProcess::interrupt()
+{
+#ifdef Q_OS_UNIX
+    Q_PID pid = m_gdbProc.pid();
+    int res = ::kill(pid, SIGINT);
+    if (res != 0)
+        m_errorString = QString::fromLocal8Bit(strerror(errno));
+    return res == 0;
+#else
+    QTC_ASSERT(false, "NOT IMPLEMENTED");
+    return false;
+#endif
+}
+
 QProcess::ProcessState LocalGdbProcess::state() const
 {
     return m_gdbProc.state();
@@ -84,7 +106,7 @@ QProcess::ProcessState LocalGdbProcess::state() const
 
 QString LocalGdbProcess::errorString() const
 {
-    return m_gdbProc.errorString();
+    return m_errorString + m_gdbProc.errorString();
 }
 
 QProcessEnvironment LocalGdbProcess::processEnvironment() const
index 12cda6b..bc7916a 100644 (file)
@@ -50,6 +50,7 @@ public:
     virtual bool waitForStarted();
     virtual qint64 write(const QByteArray &data);
     virtual void kill();
+    virtual bool interrupt();
 
     virtual QProcess::ProcessState state() const;
     virtual QString errorString() const;
@@ -61,6 +62,7 @@ public:
 
 private:
     QProcess m_gdbProc;
+    QString m_errorString;
 };
 
 } // namespace Internal
index 124e43f..03c7efc 100644 (file)
@@ -237,6 +237,11 @@ void RemoteGdbProcess::kill()
     }
 }
 
+bool RemoteGdbProcess::interrupt()
+{
+    return false;
+}
+
 void RemoteGdbProcess::interruptInferior()
 {
     QTC_ASSERT(m_state == RunningGdb, return);
index 6475c62..7e24c4f 100644 (file)
@@ -60,6 +60,7 @@ public:
     virtual bool waitForStarted();
     virtual qint64 write(const QByteArray &data);
     virtual void kill();
+    virtual bool interrupt();
 
     virtual QProcess::ProcessState state() const;
     virtual QString errorString() const;
index deb33a0..4b7d732 100644 (file)
@@ -274,8 +274,15 @@ void RemoteGdbServerAdapter::runEngine()
 void RemoteGdbServerAdapter::interruptInferior()
 {
     QTC_ASSERT(state() == InferiorStopRequested, qDebug() << state());
-    m_engine->postCommand("-exec-interrupt", GdbEngine::Immediate,
-        CB(handleInterruptInferior));
+    //m_engine->postCommand("-exec-interrupt", GdbEngine::Immediate,
+    //    CB(handleInterruptInferior));
+    bool ok = m_gdbProc.interrupt();
+    if (!ok) {
+        // FIXME: Extra state needed?
+        m_engine->showMessage(_("NOTE: INFERIOR STOP NOT POSSIBLE"));
+        m_engine->showStatusMessage(tr("Interrupting not possible"));
+        m_engine->notifyInferiorRunOk();
+    }
 }
 
 void RemoteGdbServerAdapter::handleInterruptInferior(const GdbResponse &response)