diff options
author | hjk <qtc-committer@nokia.com> | 2012-06-05 11:05:58 +0200 |
---|---|---|
committer | hjk <qthjk@ovi.com> | 2012-06-05 11:24:12 +0200 |
commit | e3bd438a8f19e0a4c12ebf06ed17c6c549d65c96 (patch) | |
tree | c5cb6ac203a422b6472f93a40e510406955f8035 | |
parent | a7f8c3c8274d0ebc0225b62b18cb3cab26caac59 (diff) |
debugger: make startGdb response handling asyncronous
This allows adapters to take all responses from the startup commands
into account.
Change-Id: I295cb211a4b69cfb8c59b34030aaee8120ffe98e
Reviewed-by: hjk <qthjk@ovi.com>
-rw-r--r-- | src/plugins/debugger/gdb/abstractgdbadapter.h | 2 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/attachgdbadapter.cpp | 11 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/attachgdbadapter.h | 2 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/codagdbadapter.cpp | 14 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/codagdbadapter.h | 4 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/coregdbadapter.cpp | 10 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/coregdbadapter.h | 2 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 20 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.h | 3 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/localplaingdbadapter.cpp | 13 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/localplaingdbadapter.h | 2 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/remotegdbserveradapter.cpp | 15 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/remotegdbserveradapter.h | 4 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/remoteplaingdbadapter.cpp | 14 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/remoteplaingdbadapter.h | 4 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/termgdbadapter.cpp | 14 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/termgdbadapter.h | 2 |
17 files changed, 100 insertions, 36 deletions
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h index 51ed0bf5c5..981c1c5e7b 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.h +++ b/src/plugins/debugger/gdb/abstractgdbadapter.h @@ -72,6 +72,8 @@ public: virtual void write(const QByteArray &data); virtual void startAdapter() = 0; + virtual void handleGdbStartDone() = 0; + virtual void handleGdbStartFailed() = 0; virtual void setupInferior() = 0; virtual void runEngine() = 0; virtual void interruptInferior() = 0; diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index 98e35c4b9b..8428169dd6 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -63,13 +63,18 @@ void AttachGdbAdapter::startAdapter() { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); showMessage(_("TRYING TO START ADAPTER")); + m_engine->startGdb(); +} - if (!m_engine->startGdb()) - return; - +void AttachGdbAdapter::handleGdbStartDone() +{ m_engine->handleAdapterStarted(); } +void AttachGdbAdapter::handleGdbStartFailed() +{ +} + void AttachGdbAdapter::setupInferior() { QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h index e9a41ac49d..586105b7a7 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.h +++ b/src/plugins/debugger/gdb/attachgdbadapter.h @@ -56,6 +56,8 @@ private: DumperHandling dumperHandling() const { return DumperLoadedByGdb; } void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void runEngine(); void interruptInferior(); diff --git a/src/plugins/debugger/gdb/codagdbadapter.cpp b/src/plugins/debugger/gdb/codagdbadapter.cpp index 014c3bfc7f..8c07bdee7b 100644 --- a/src/plugins/debugger/gdb/codagdbadapter.cpp +++ b/src/plugins/debugger/gdb/codagdbadapter.cpp @@ -386,13 +386,19 @@ void CodaGdbAdapter::startGdb() { QStringList gdbArgs; gdbArgs.append(_("--nx")); // Do not read .gdbinit file - if (!m_engine->startGdb(gdbArgs)) { - cleanup(); - return; - } + m_engine->startGdb(gdbArgs); +} + +void CodaGdbAdapter::handleGdbStartDone() +{ m_engine->handleAdapterStarted(); } +void CodaGdbAdapter::handleGdbStartFailed() +{ + cleanup(); +} + void CodaGdbAdapter::codaDeviceError(const QString &errorString) { logMessage(errorString); diff --git a/src/plugins/debugger/gdb/codagdbadapter.h b/src/plugins/debugger/gdb/codagdbadapter.h index 56efb451a8..a536d7109a 100644 --- a/src/plugins/debugger/gdb/codagdbadapter.h +++ b/src/plugins/debugger/gdb/codagdbadapter.h @@ -83,7 +83,7 @@ public: typedef Coda::Callback<const GdbResponse &> GdbCallback; explicit CodaGdbAdapter(GdbEngine *engine); - virtual ~CodaGdbAdapter(); + ~CodaGdbAdapter(); void setGdbServerName(const QString &name); QString gdbServerName() const { return m_gdbServerName; } @@ -111,6 +111,8 @@ public: private: void setupDeviceSignals(); void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void runEngine(); void interruptInferior(); diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp index 2f0569cd8e..9826332725 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.cpp +++ b/src/plugins/debugger/gdb/coregdbadapter.cpp @@ -78,9 +78,15 @@ void CoreGdbAdapter::startAdapter() QStringList args; args.append(_("-ex")); args.append(_("set auto-solib-add off")); - if (!m_engine->startGdb(args, QString())) - return; + m_engine->startGdb(args); +} + +void CoreGdbAdapter::handleGdbStartFailed() +{ +} +void CoreGdbAdapter::handleGdbStartDone() +{ //if (m_executable.isEmpty()) { // showMessageBox(QMessageBox::Warning, // tr("Error Loading Symbols"), diff --git a/src/plugins/debugger/gdb/coregdbadapter.h b/src/plugins/debugger/gdb/coregdbadapter.h index f1443dcd99..d2df00a84e 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.h +++ b/src/plugins/debugger/gdb/coregdbadapter.h @@ -56,6 +56,8 @@ private: DumperHandling dumperHandling() const { return DumperNotAvailable; } void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void runEngine(); void interruptInferior(); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index c33b16f119..a2b33bb3a6 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4747,7 +4747,7 @@ bool checkGdbConfiguration(const DebuggerStartParameters &sp, ConfigurationCheck // Starting up & shutting down // -bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) +void GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) { const QByteArray tests = qgetenv("QTC_DEBUGGER_TESTS"); foreach (const QByteArray &test, tests.split(',')) @@ -4760,10 +4760,11 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) const DebuggerStartParameters &sp = startParameters(); m_gdb = gdbBinary(sp); if (m_gdb.isEmpty()) { + m_gdbAdapter->handleGdbStartFailed(); handleAdapterStartFailed( msgNoGdbBinaryForToolChain(sp.toolChainAbi), _(Constants::DEBUGGER_COMMON_SETTINGS_ID)); - return false; + return; } QStringList gdbArgs; gdbArgs << _("-i"); @@ -4785,9 +4786,10 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) gdbProc()->start(m_gdb, gdbArgs); if (!gdbProc()->waitForStarted()) { + m_gdbAdapter->handleGdbStartFailed(); const QString msg = errorMessage(QProcess::FailedToStart); handleAdapterStartFailed(msg, settingsIdHint); - return false; + return; } showMessage(_("GDB STARTED, INITIALIZING IT")); @@ -4845,7 +4847,6 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) //postCommand(_("handle SIGTERM pass nostop print")); postCommand("set unwindonsignal on"); - postCommand("pwd"); postCommand("set width 0"); postCommand("set height 0"); @@ -4861,6 +4862,8 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) postCommand("maintenance set internal-warning quit no", ConsoleCommand); postCommand("maintenance set internal-error quit no", ConsoleCommand); + showMessage(_("THE FOLLOWING COMMAND CHECKS AVAILABLE FEATURES. " + "AN ERROR IS EXPECTED.")); postCommand("disassemble 0 0", ConsoleCommand, CB(handleDisassemblerCheck)); if (attemptQuickStart()) { @@ -4871,7 +4874,14 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &settingsIdHint) loadPythonDumpers(); } - return true; + // Dummy command to guarantee a roundtrip before the adapter proceed. + postCommand("pwd", ConsoleCommand, CB(handleGdbStart)); +} + +void GdbEngine::handleGdbStart(const GdbResponse &response) +{ + Q_UNUSED(response); + m_gdbAdapter->handleGdbStartDone(); } void GdbEngine::loadInitScript() diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 332286c20e..1bbfb1708f 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -249,8 +249,9 @@ private: ////////// General State ////////// private: ////////// Gdb Process Management ////////// AbstractGdbAdapter *createAdapter(); - bool startGdb(const QStringList &args = QStringList(), + void startGdb(const QStringList &args = QStringList(), const QString &settingsIdHint = QString()); + void handleGdbStart(const GdbResponse &response); void handleInferiorShutdown(const GdbResponse &response); void handleGdbExit(const GdbResponse &response); void handleRemoteSetupDone(int gdbServerPort, int qmlPort); diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.cpp b/src/plugins/debugger/gdb/localplaingdbadapter.cpp index 1b8cff4351..c494f3ac64 100644 --- a/src/plugins/debugger/gdb/localplaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/localplaingdbadapter.cpp @@ -93,14 +93,19 @@ void LocalPlainGdbAdapter::startAdapter() if (startParameters().environment.size()) m_gdbProc.setEnvironment(startParameters().environment.toStringList()); - if (!m_engine->startGdb(gdbArgs)) { - m_outputCollector.shutdown(); - return; - } + m_engine->startGdb(gdbArgs); +} +void LocalPlainGdbAdapter::handleGdbStartDone() +{ m_engine->handleAdapterStarted(); } +void LocalPlainGdbAdapter::handleGdbStartFailed() +{ + m_outputCollector.shutdown(); +} + void LocalPlainGdbAdapter::setupInferior() { AbstractPlainGdbAdapter::setupInferior(); diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.h b/src/plugins/debugger/gdb/localplaingdbadapter.h index 39181bac7e..3e9289bd30 100644 --- a/src/plugins/debugger/gdb/localplaingdbadapter.h +++ b/src/plugins/debugger/gdb/localplaingdbadapter.h @@ -55,6 +55,8 @@ public: private: void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void runEngine(); void interruptInferior(); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index 0d17595cfc..38575baefa 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -98,7 +98,7 @@ void RemoteGdbServerAdapter::startAdapter() if (startParameters().requestRemoteSetup) m_engine->notifyEngineRequestRemoteSetup(); else - handleSetupDone(); + m_engine->startGdb(); } void RemoteGdbServerAdapter::uploadProcError(QProcess::ProcessError error) @@ -155,7 +155,7 @@ void RemoteGdbServerAdapter::uploadProcFinished() { if (m_uploadProc.exitStatus() == QProcess::NormalExit && m_uploadProc.exitCode() == 0) - handleSetupDone(); + m_engine->startGdb(); else handleRemoteSetupFailed(m_uploadProc.errorString()); } @@ -401,13 +401,16 @@ void RemoteGdbServerAdapter::handleRemoteSetupDone(int gdbServerPort, int qmlPor QString::number(gdbServerPort)); } } - handleSetupDone(); + m_engine->startGdb(); } -void RemoteGdbServerAdapter::handleSetupDone() +void RemoteGdbServerAdapter::handleGdbStartDone() +{ + m_engine->handleAdapterStarted(); +} + +void RemoteGdbServerAdapter::handleGdbStartFailed() { - if (m_engine->startGdb()) - m_engine->handleAdapterStarted(); } void RemoteGdbServerAdapter::handleRemoteSetupFailed(const QString &reason) diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h index 7a3f88d642..0799ee48c1 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.h +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h @@ -56,6 +56,8 @@ private: DumperHandling dumperHandling() const; void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void runEngine(); void interruptInferior(); @@ -63,8 +65,6 @@ private: AbstractGdbProcess *gdbProc() { return &m_gdbProc; } - void handleSetupDone(); - signals: /* * For "external" clients of a debugger run control that need to do diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp index a3a7263b14..9f210a1461 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp @@ -47,7 +47,7 @@ RemotePlainGdbAdapter::RemotePlainGdbAdapter(GdbEngine *engine) { connect(&m_gdbProc, SIGNAL(started()), this, SLOT(handleGdbStarted())); connect(&m_gdbProc, SIGNAL(startFailed()), this, - SLOT(handleGdbStartFailed())); + SLOT(handleGdbStartFailed1())); } void RemotePlainGdbAdapter::startAdapter() @@ -117,12 +117,20 @@ void RemotePlainGdbAdapter::handleRemoteSetupDone(int gdbServerPort, int qmlPort void RemotePlainGdbAdapter::handleGdbStarted() { - if (m_engine->startGdb()) - m_engine->handleAdapterStarted(); + m_engine->startGdb(); +} + +void RemotePlainGdbAdapter::handleGdbStartDone() +{ + m_engine->handleAdapterStarted(); } void RemotePlainGdbAdapter::handleGdbStartFailed() { +} + +void RemotePlainGdbAdapter::handleGdbStartFailed1() +{ m_engine->handleAdapterStartFailed(m_gdbProc.errorString()); } diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h index 7c19e10df8..91c5825a50 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h @@ -49,10 +49,12 @@ public: private slots: void handleGdbStarted(); - void handleGdbStartFailed(); + void handleGdbStartFailed1(); private: void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void interruptInferior(); void shutdownAdapter(); diff --git a/src/plugins/debugger/gdb/termgdbadapter.cpp b/src/plugins/debugger/gdb/termgdbadapter.cpp index 135630e875..0d60863d27 100644 --- a/src/plugins/debugger/gdb/termgdbadapter.cpp +++ b/src/plugins/debugger/gdb/termgdbadapter.cpp @@ -119,10 +119,16 @@ void TermGdbAdapter::startAdapter() return; } - if (!m_engine->startGdb()) { - m_stubProc.stop(); - return; - } + m_engine->startGdb(); +} + +void TermGdbAdapter::handleGdbStartDone() +{ +} + +void TermGdbAdapter::handleGdbStartFailed() +{ + m_stubProc.stop(); } void TermGdbAdapter::handleInferiorSetupOk() diff --git a/src/plugins/debugger/gdb/termgdbadapter.h b/src/plugins/debugger/gdb/termgdbadapter.h index b56d969cd2..69f613f143 100644 --- a/src/plugins/debugger/gdb/termgdbadapter.h +++ b/src/plugins/debugger/gdb/termgdbadapter.h @@ -59,6 +59,8 @@ private: DumperHandling dumperHandling() const; void startAdapter(); + void handleGdbStartDone(); + void handleGdbStartFailed(); void setupInferior(); void runEngine(); void interruptInferior(); |