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);
}
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;
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);
#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 {
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();
QString LocalGdbProcess::errorString() const
{
- return m_gdbProc.errorString();
+ return m_errorString + m_gdbProc.errorString();
}
QProcessEnvironment LocalGdbProcess::processEnvironment() const
virtual bool waitForStarted();
virtual qint64 write(const QByteArray &data);
virtual void kill();
+ virtual bool interrupt();
virtual QProcess::ProcessState state() const;
virtual QString errorString() const;
private:
QProcess m_gdbProc;
+ QString m_errorString;
};
} // namespace Internal
}
}
+bool RemoteGdbProcess::interrupt()
+{
+ return false;
+}
+
void RemoteGdbProcess::interruptInferior()
{
QTC_ASSERT(m_state == RunningGdb, return);
virtual bool waitForStarted();
virtual qint64 write(const QByteArray &data);
virtual void kill();
+ virtual bool interrupt();
virtual QProcess::ProcessState state() const;
virtual QString errorString() const;
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)