Commit efb02a30 authored by hjk's avatar hjk
Browse files

debugger: rework plain gdb shutdown logic

parent 1d64e169
...@@ -40,6 +40,26 @@ namespace Internal { ...@@ -40,6 +40,26 @@ namespace Internal {
class GdbEngine; class GdbEngine;
enum GdbAdapterState
{
AdapterNotRunning,
AdapterStarting,
AdapterStarted,
AdapterStartFailed,
InferiorPreparing,
InferiorPrepared,
InferiorPreparationFailed,
InferiorStarting,
InferiorStarted,
InferiorStartFailed,
InferiorShuttingDown,
InferiorShutDown,
InferiorShutdownFailed,
AdapterShuttingDown,
//AdapterShutDown, // use AdapterNotRunning
AdapterShutdownFailed,
};
// AbstractGdbAdapter is inherited by PlainGdbAdapter used for local // AbstractGdbAdapter is inherited by PlainGdbAdapter used for local
// debugging and TrkGdbAdapter used for on-device debugging. // debugging and TrkGdbAdapter used for on-device debugging.
// In the PlainGdbAdapter case it's just a wrapper around a QProcess running // In the PlainGdbAdapter case it's just a wrapper around a QProcess running
...@@ -51,10 +71,9 @@ class AbstractGdbAdapter : public QObject ...@@ -51,10 +71,9 @@ class AbstractGdbAdapter : public QObject
public: public:
AbstractGdbAdapter(GdbEngine *engine, QObject *parent = 0) AbstractGdbAdapter(GdbEngine *engine, QObject *parent = 0)
: QObject(parent), m_engine(engine) : QObject(parent), m_engine(engine), m_state(AdapterNotRunning)
{} {}
virtual QProcess::ProcessState state() const = 0;
virtual QString errorString() const = 0; virtual QString errorString() const = 0;
virtual QByteArray readAllStandardError() = 0; virtual QByteArray readAllStandardError() = 0;
virtual QByteArray readAllStandardOutput() = 0; virtual QByteArray readAllStandardOutput() = 0;
...@@ -90,8 +109,13 @@ signals: ...@@ -90,8 +109,13 @@ signals:
void readyReadStandardOutput(); void readyReadStandardOutput();
void readyReadStandardError(); void readyReadStandardError();
public:
virtual GdbAdapterState state() const { return m_state; }
protected: protected:
virtual void setState(GdbAdapterState state) { m_state = state; }
GdbEngine * const m_engine; GdbEngine * const m_engine;
GdbAdapterState m_state;
}; };
} // namespace Internal } // namespace Internal
......
...@@ -661,10 +661,10 @@ void GdbEngine::readGdbStandardOutput() ...@@ -661,10 +661,10 @@ void GdbEngine::readGdbStandardOutput()
void GdbEngine::interruptInferior() void GdbEngine::interruptInferior()
{ {
debugMessage(_("GDBENGINE INTERRUPT INFERIOR: %1").arg(m_gdbAdapter->state())); // debugMessage(_("GDBENGINE INTERRUPT INFERIOR: %1").arg(m_gdbAdapter->state()));
qq->notifyInferiorStopRequested(); qq->notifyInferiorStopRequested();
if (m_gdbAdapter->state() == QProcess::NotRunning) { if (m_gdbAdapter->state() == AdapterNotRunning) {
debugMessage(_("TRYING TO INTERRUPT INFERIOR WITHOUT RUNNING GDB")); debugMessage(_("TRYING TO INTERRUPT INFERIOR WITHOUT RUNNING GDB"));
qq->notifyInferiorExited(); qq->notifyInferiorExited();
return; return;
...@@ -691,6 +691,13 @@ void GdbEngine::maybeHandleInferiorPidChanged(const QString &pid0) ...@@ -691,6 +691,13 @@ void GdbEngine::maybeHandleInferiorPidChanged(const QString &pid0)
void GdbEngine::postCommand(const QString &command, AdapterCallback callback, void GdbEngine::postCommand(const QString &command, AdapterCallback callback,
const char *callbackName, const QVariant &cookie) const char *callbackName, const QVariant &cookie)
{
postCommand(command, NoFlags, callback, callbackName, cookie);
}
void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags,
AdapterCallback callback,
const char *callbackName, const QVariant &cookie)
{ {
GdbCommand cmd; GdbCommand cmd;
cmd.command = command; cmd.command = command;
...@@ -722,7 +729,7 @@ void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags, ...@@ -722,7 +729,7 @@ void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags,
void GdbEngine::postCommandHelper(const GdbCommand &cmd) void GdbEngine::postCommandHelper(const GdbCommand &cmd)
{ {
if (m_gdbAdapter->state() == QProcess::NotRunning) { if (m_gdbAdapter->state() == AdapterNotRunning) {
debugMessage(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command); debugMessage(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command);
return; return;
} }
...@@ -753,7 +760,7 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd) ...@@ -753,7 +760,7 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd)
void GdbEngine::flushCommand(const GdbCommand &cmd0) void GdbEngine::flushCommand(const GdbCommand &cmd0)
{ {
GdbCommand cmd = cmd0; GdbCommand cmd = cmd0;
if (m_gdbAdapter->state() != QProcess::Running) { if (m_gdbAdapter->state() == AdapterNotRunning) {
emit gdbInputAvailable(LogInput, cmd.command); emit gdbInputAvailable(LogInput, cmd.command);
debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command); debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + cmd.command);
return; return;
...@@ -858,7 +865,7 @@ void GdbEngine::handleResultRecord(const GdbResultRecord &record) ...@@ -858,7 +865,7 @@ void GdbEngine::handleResultRecord(const GdbResultRecord &record)
void GdbEngine::executeDebuggerCommand(const QString &command) void GdbEngine::executeDebuggerCommand(const QString &command)
{ {
if (m_gdbAdapter->state() != QProcess::Running) { if (m_gdbAdapter->state() == AdapterNotRunning) {
debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + command); debugMessage(_("GDB PROCESS NOT RUNNING, PLAIN CMD IGNORED: ") + command);
return; return;
} }
...@@ -1484,7 +1491,9 @@ QString GdbEngine::fullName(const QStringList &candidates) ...@@ -1484,7 +1491,9 @@ QString GdbEngine::fullName(const QStringList &candidates)
void GdbEngine::shutdown() void GdbEngine::shutdown()
{ {
exitDebugger(); m_outputCollector.shutdown();
initializeVariables();
m_gdbAdapter->shutdownAdapter();
} }
void GdbEngine::detachDebugger() void GdbEngine::detachDebugger()
...@@ -1496,29 +1505,9 @@ void GdbEngine::detachDebugger() ...@@ -1496,29 +1505,9 @@ void GdbEngine::detachDebugger()
void GdbEngine::exitDebugger() void GdbEngine::exitDebugger()
{ {
debugMessage(_("GDBENGINE EXITDEBUGGER: %1").arg(m_gdbAdapter->state())); m_outputCollector.shutdown();
if (m_gdbAdapter->state() == QProcess::Starting) { initializeVariables();
debugMessage(_("WAITING FOR GDB STARTUP TO SHUTDOWN: %1") m_gdbAdapter->shutdownAdapter();
.arg(m_gdbAdapter->state()));
// FIXME: handle this!
//m_gdbAdapter->waitForStarted();
}
if (m_gdbAdapter->state() == QProcess::Running) {
debugMessage(_("WAITING FOR RUNNING GDB TO SHUTDOWN: %1")
.arg(m_gdbAdapter->state()));
if (status() != DebuggerInferiorStopped
&& status() != DebuggerProcessStartingUp) {
QTC_ASSERT(status() == DebuggerInferiorRunning,
qDebug() << "STATUS ON EXITDEBUGGER:" << status());
interruptInferior();
}
if (startMode() == AttachExternal || startMode() == AttachCrashedExternal)
postCommand(_("detach"), CB(handleExitHelper));
else
postCommand(_("kill"), CB(handleExitHelper));
} else {
exitDebugger2();
}
} }
void GdbEngine::handleExitHelper(const GdbResultRecord &, const QVariant &) void GdbEngine::handleExitHelper(const GdbResultRecord &, const QVariant &)
...@@ -4316,6 +4305,7 @@ void GdbEngine::handleInferiorStarted() ...@@ -4316,6 +4305,7 @@ void GdbEngine::handleInferiorStarted()
void GdbEngine::handleInferiorShutDown() void GdbEngine::handleInferiorShutDown()
{ {
debugMessage(_("INFERIOR SUCCESSFULLY SHUT DOWN")); debugMessage(_("INFERIOR SUCCESSFULLY SHUT DOWN"));
qq->notifyInferiorExited();
} }
void GdbEngine::handleInferiorShutdownFailed(const QString &msg) void GdbEngine::handleInferiorShutdownFailed(const QString &msg)
...@@ -4325,6 +4315,18 @@ void GdbEngine::handleInferiorShutdownFailed(const QString &msg) ...@@ -4325,6 +4315,18 @@ void GdbEngine::handleInferiorShutdownFailed(const QString &msg)
tr("Inferior shutdown failed:\n") + msg); tr("Inferior shutdown failed:\n") + msg);
} }
void GdbEngine::handleAdapterShutDown()
{
debugMessage(_("ADAPTER SUCCESSFULLY SHUT DOWN"));
}
void GdbEngine::handleAdapterShutdownFailed(const QString &msg)
{
debugMessage(_("ADAPTER SHUTDOWN FAILED"));
QMessageBox::critical(mainWindow(), tr("Error"),
tr("Inferior shutdown failed:\n") + msg);
}
// //
// Factory // Factory
// //
......
...@@ -214,6 +214,11 @@ private: ...@@ -214,6 +214,11 @@ private:
AdapterCallback callback, AdapterCallback callback,
const char *callbackName, const char *callbackName,
const QVariant &cookie = QVariant()); const QVariant &cookie = QVariant());
void postCommand(const QString &command,
GdbCommandFlags flags,
AdapterCallback callback,
const char *callbackName,
const QVariant &cookie = QVariant());
void postCommandHelper(const GdbCommand &cmd); void postCommandHelper(const GdbCommand &cmd);
void setTokenBarrier(); void setTokenBarrier();
......
...@@ -57,6 +57,7 @@ namespace Internal { ...@@ -57,6 +57,7 @@ namespace Internal {
PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent) PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent)
: AbstractGdbAdapter(engine, parent) : AbstractGdbAdapter(engine, parent)
{ {
QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)), connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)),
this, SIGNAL(error(QProcess::ProcessError))); this, SIGNAL(error(QProcess::ProcessError)));
connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()), connect(&m_gdbProc, SIGNAL(readyReadStandardOutput()),
...@@ -64,9 +65,9 @@ PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent) ...@@ -64,9 +65,9 @@ PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent)
connect(&m_gdbProc, SIGNAL(readyReadStandardError()), connect(&m_gdbProc, SIGNAL(readyReadStandardError()),
this, SIGNAL(readyReadStandardError())); this, SIGNAL(readyReadStandardError()));
connect(&m_gdbProc, SIGNAL(started()), connect(&m_gdbProc, SIGNAL(started()),
this, SIGNAL(adapterStarted())); this, SLOT(handleGdbStarted()));
connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)), connect(&m_gdbProc, SIGNAL(finished(int, QProcess::ExitStatus)),
this, SLOT(handleFinished(int, QProcess::ExitStatus))); this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
m_stubProc.setMode(Core::Utils::ConsoleProcess::Debug); m_stubProc.setMode(Core::Utils::ConsoleProcess::Debug);
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
...@@ -84,6 +85,8 @@ PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent) ...@@ -84,6 +85,8 @@ PlainGdbAdapter::PlainGdbAdapter(GdbEngine *engine, QObject *parent)
void PlainGdbAdapter::startAdapter(const DebuggerStartParametersPtr &sp) void PlainGdbAdapter::startAdapter(const DebuggerStartParametersPtr &sp)
{ {
QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
setState(AdapterStarting);
debugMessage(_("TRYING TO START ADAPTER")); debugMessage(_("TRYING TO START ADAPTER"));
m_startParameters = sp; m_startParameters = sp;
...@@ -121,10 +124,20 @@ void PlainGdbAdapter::startAdapter(const DebuggerStartParametersPtr &sp) ...@@ -121,10 +124,20 @@ void PlainGdbAdapter::startAdapter(const DebuggerStartParametersPtr &sp)
m_gdbProc.start(location, gdbArgs); m_gdbProc.start(location, gdbArgs);
} }
void PlainGdbAdapter::handleGdbStarted()
{
QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
setState(AdapterStarted);
emit adapterStarted();
}
void PlainGdbAdapter::prepareInferior() void PlainGdbAdapter::prepareInferior()
{ {
QTC_ASSERT(state() == AdapterStarted, qDebug() << state());
setState(InferiorPreparing);
if (!m_startParameters->processArgs.isEmpty()) if (!m_startParameters->processArgs.isEmpty())
m_engine->postCommand(_("-exec-arguments ") + m_startParameters->processArgs.join(_(" "))); m_engine->postCommand(_("-exec-arguments ")
+ m_startParameters->processArgs.join(_(" ")));
QFileInfo fi(m_engine->startParameters().executable); QFileInfo fi(m_engine->startParameters().executable);
m_engine->postCommand(_("-file-exec-and-symbols \"%1\"").arg(fi.absoluteFilePath()), m_engine->postCommand(_("-file-exec-and-symbols \"%1\"").arg(fi.absoluteFilePath()),
CB(handleFileExecAndSymbols)); CB(handleFileExecAndSymbols));
...@@ -132,18 +145,23 @@ void PlainGdbAdapter::prepareInferior() ...@@ -132,18 +145,23 @@ void PlainGdbAdapter::prepareInferior()
void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResultRecord &response, const QVariant &) void PlainGdbAdapter::handleFileExecAndSymbols(const GdbResultRecord &response, const QVariant &)
{ {
QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
if (response.resultClass == GdbResultDone) { if (response.resultClass == GdbResultDone) {
//m_breakHandler->clearBreakMarkers(); //m_breakHandler->clearBreakMarkers();
setState(InferiorPrepared);
emit inferiorPrepared(); emit inferiorPrepared();
} else if (response.resultClass == GdbResultError) { } else if (response.resultClass == GdbResultError) {
QString msg = tr("Starting executable failed:\n") + QString msg = tr("Starting executable failed:\n") +
__(response.data.findChild("msg").data()); __(response.data.findChild("msg").data());
setState(InferiorPreparationFailed);
emit inferiorPreparationFailed(msg); emit inferiorPreparationFailed(msg);
} }
} }
void PlainGdbAdapter::startInferior() void PlainGdbAdapter::startInferior()
{ {
QTC_ASSERT(state() == InferiorPrepared, qDebug() << state());
setState(InferiorStarting);
m_engine->postCommand(_("-exec-run"), CB(handleExecRun)); m_engine->postCommand(_("-exec-run"), CB(handleExecRun));
/* /*
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
...@@ -163,6 +181,7 @@ void PlainGdbAdapter::startInferior() ...@@ -163,6 +181,7 @@ void PlainGdbAdapter::startInferior()
void PlainGdbAdapter::handleInfoTarget(const GdbResultRecord &response, const QVariant &) void PlainGdbAdapter::handleInfoTarget(const GdbResultRecord &response, const QVariant &)
{ {
QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)
Q_UNUSED(response) Q_UNUSED(response)
#else #else
...@@ -190,13 +209,16 @@ void PlainGdbAdapter::handleInfoTarget(const GdbResultRecord &response, const QV ...@@ -190,13 +209,16 @@ void PlainGdbAdapter::handleInfoTarget(const GdbResultRecord &response, const QV
void PlainGdbAdapter::handleExecRun(const GdbResultRecord &response, const QVariant &) void PlainGdbAdapter::handleExecRun(const GdbResultRecord &response, const QVariant &)
{ {
QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
if (response.resultClass == GdbResultRunning) { if (response.resultClass == GdbResultRunning) {
setState(InferiorStarted);
emit inferiorStarted(); emit inferiorStarted();
} else { } else {
QTC_ASSERT(response.resultClass == GdbResultError, /**/); QTC_ASSERT(response.resultClass == GdbResultError, /**/);
const QByteArray &msg = response.data.findChild("msg").data(); const QByteArray &msg = response.data.findChild("msg").data();
//QTC_ASSERT(status() == DebuggerInferiorRunning, /**/); //QTC_ASSERT(status() == DebuggerInferiorRunning, /**/);
//interruptInferior(); //interruptInferior();
setState(InferiorStartFailed);
emit inferiorStartFailed(msg); emit inferiorStartFailed(msg);
} }
} }
...@@ -221,26 +243,57 @@ void PlainGdbAdapter::interruptInferior() ...@@ -221,26 +243,57 @@ void PlainGdbAdapter::interruptInferior()
void PlainGdbAdapter::shutdownAdapter() void PlainGdbAdapter::shutdownAdapter()
{ {
m_engine->postCommand(_("-gdb-exit"), CB(handleExit)); if (state() == InferiorStarted) {
// 20s can easily happen when loading webkit debug information setState(InferiorShuttingDown);
if (!m_gdbProc.waitForFinished(20000)) { m_engine->postCommand(_("kill"), CB(handleKill));
debugMessage(_("FORCING TERMINATION: %1") return;
.arg(state())); }
if (state() == InferiorShutDown) {
setState(AdapterShuttingDown);
m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
return;
}
/*
if (state() == InferiorShutdownFailed) {
m_gdbProc.terminate(); m_gdbProc.terminate();
// 20s can easily happen when loading webkit debug information
m_gdbProc.waitForFinished(20000); m_gdbProc.waitForFinished(20000);
setState(AdapterShuttingDown);
debugMessage(_("FORCING TERMINATION: %1")
.arg(state()));
if (state() != QProcess::NotRunning) {
debugMessage(_("PROBLEM STOPPING DEBUGGER: STATE %1")
.arg(state()));
m_gdbProc.kill();
}
m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
return;
} }
if (state() != QProcess::NotRunning) { */
debugMessage(_("PROBLEM STOPPING DEBUGGER: STATE %1") QTC_ASSERT(state() == AdapterNotRunning, qDebug() << state());
.arg(state())); }
m_gdbProc.kill();
void PlainGdbAdapter::handleKill(const GdbResultRecord &response, const QVariant &)
{
if (response.resultClass == GdbResultDone) {
setState(InferiorShutDown);
emit inferiorShutDown();
shutdownAdapter(); // re-iterate...
} else if (response.resultClass == GdbResultError) {
QString msg = tr("Inferior process could not be stopped:\n") +
__(response.data.findChild("msg").data());
setState(InferiorShutdownFailed);
emit inferiorShutdownFailed(msg);
} }
} }
void PlainGdbAdapter::handleExit(const GdbResultRecord &response, const QVariant &) void PlainGdbAdapter::handleExit(const GdbResultRecord &response, const QVariant &)
{ {
if (response.resultClass == GdbResultDone) { if (response.resultClass == GdbResultDone) {
emit adapterShutDown(); // don't set state here, this will be handled in handleGdbFinished()
} else if (response.resultClass == GdbResultError) { } else if (response.resultClass == GdbResultError) {
QString msg = tr("Gdb process could not be stopped:\n") + QString msg = tr("Gdb process could not be stopped:\n") +
__(response.data.findChild("msg").data()); __(response.data.findChild("msg").data());
...@@ -248,9 +301,11 @@ void PlainGdbAdapter::handleExit(const GdbResultRecord &response, const QVariant ...@@ -248,9 +301,11 @@ void PlainGdbAdapter::handleExit(const GdbResultRecord &response, const QVariant
} }
} }
void PlainGdbAdapter::handleFinished(int, QProcess::ExitStatus) void PlainGdbAdapter::handleGdbFinished(int, QProcess::ExitStatus)
{ {
debugMessage(_("GDB PROESS FINISHED")); debugMessage(_("GDB PROESS FINISHED"));
setState(AdapterNotRunning);
emit adapterShutDown();
} }
void PlainGdbAdapter::shutdownInferior() void PlainGdbAdapter::shutdownInferior()
...@@ -287,5 +342,6 @@ void PlainGdbAdapter::emitAdapterStartFailed(const QString &msg) ...@@ -287,5 +342,6 @@ void PlainGdbAdapter::emitAdapterStartFailed(const QString &msg)
m_stubProc.blockSignals(false); m_stubProc.blockSignals(false);
emit adapterStartFailed(msg); emit adapterStartFailed(msg);
} }
} // namespace Internal } // namespace Internal
} // namespace Debugger } // namespace Debugger
...@@ -57,7 +57,6 @@ public: ...@@ -57,7 +57,6 @@ public:
//void kill() { m_gdbProc.kill(); } //void kill() { m_gdbProc.kill(); }
//void terminate() { m_gdbProc.terminate(); } //void terminate() { m_gdbProc.terminate(); }
QProcess::ProcessState state() const { return m_gdbProc.state(); }
QString errorString() const { return m_gdbProc.errorString(); } QString errorString() const { return m_gdbProc.errorString(); }
QByteArray readAllStandardError() { return m_gdbProc.readAllStandardError(); } QByteArray readAllStandardError() { return m_gdbProc.readAllStandardError(); }
QByteArray readAllStandardOutput() { return m_gdbProc.readAllStandardOutput(); } QByteArray readAllStandardOutput() { return m_gdbProc.readAllStandardOutput(); }
...@@ -75,6 +74,7 @@ public: ...@@ -75,6 +74,7 @@ public:
private: private:
void handleFileExecAndSymbols(const GdbResultRecord &, const QVariant &); void handleFileExecAndSymbols(const GdbResultRecord &, const QVariant &);
void handleKill(const GdbResultRecord &, const QVariant &);
void handleExit(const GdbResultRecord &, const QVariant &); void handleExit(const GdbResultRecord &, const QVariant &);
void handleStubAttached(const GdbResultRecord &, const QVariant &); void handleStubAttached(const GdbResultRecord &, const QVariant &);
void handleExecRun(const GdbResultRecord &response, const QVariant &); void handleExecRun(const GdbResultRecord &response, const QVariant &);
...@@ -82,7 +82,8 @@ private: ...@@ -82,7 +82,8 @@ private:
void debugMessage(const QString &msg) { m_engine->debugMessage(msg); } void debugMessage(const QString &msg) { m_engine->debugMessage(msg); }
void emitAdapterStartFailed(const QString &msg); void emitAdapterStartFailed(const QString &msg);
Q_SLOT void handleFinished(int, QProcess::ExitStatus); Q_SLOT void handleGdbFinished(int, QProcess::ExitStatus);
Q_SLOT void handleGdbStarted();
Q_SLOT void stubStarted(); Q_SLOT void stubStarted();
Q_SLOT void stubError(const QString &msg); Q_SLOT void stubError(const QString &msg);
......
...@@ -1488,9 +1488,10 @@ bool TrkGdbAdapter::waitForFinished(int msecs) ...@@ -1488,9 +1488,10 @@ bool TrkGdbAdapter::waitForFinished(int msecs)
return m_gdbProc.waitForFinished(msecs); return m_gdbProc.waitForFinished(msecs);
} }
QProcess::ProcessState TrkGdbAdapter::state() const GdbAdapterState TrkGdbAdapter::state() const
{ {
return m_gdbProc.state(); //return m_gdbProc.state();
return AdapterNotRunning; // FIXME
} }
QString TrkGdbAdapter::errorString() const QString TrkGdbAdapter::errorString() const
......
...@@ -111,7 +111,7 @@ public: ...@@ -111,7 +111,7 @@ public:
void kill(); void kill();
void terminate(); void terminate();
bool waitForFinished(int msecs = 30000); bool waitForFinished(int msecs = 30000);
QProcess::ProcessState state() const; GdbAdapterState state() const;
QString errorString() const; QString errorString() const;
QByteArray readAllStandardError(); QByteArray readAllStandardError();
QByteArray readAllStandardOutput(); QByteArray readAllStandardOutput();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment